Soporte » Plugins y Hacks » Broken Link Checker » PHP 7 Warnings

  • Moderador almendron

    (@almendron)


    FILE: /../wp-content/plugins/broken-link-checker/includes/utility-class.php
    42 | WARNING | INI directive ‘safe_mode’ is deprecated since PHP 5.3 and removed since PHP 5.4.

    La función implicada es la siguiente:

      /**
       * blcUtility::is_safe_mode()
       * Checks if PHP is running in safe mode
       *
       * @return bool
       */
    	static function is_safe_mode(){
    		$safe_mode = ini_get('safe_mode');
    		//Null, 0, '', '0' and so on count as false 
    		if ( !$safe_mode ) return false;
    		//Test for some textual true/false variations
    		switch ( strtolower($safe_mode) ){
    			case 'on':
    			case 'true':
    			case 'yes':
    				return true;
    				
    			case 'off':
    			case 'false':
    			case 'no':
    				return false;
    				
    			default: //Let PHP handle anything else
    				return (bool)(int)$safe_mode;
    		}
    	}

    Lo primero de todo: ¿safe mode ha desaparecido sin más o se ha cambiado por otra?
    Lo pregunto porque la solución obvia sería sustituir safe mode por la nueva directiva.

    En cualquier caso, entiendo que ini_get('safe_mode') devolverá FALSE al no existir la directiva y por tanto no provocará ningún error.
    ¿Es correcto?

    • Este debate fue modificado hace 6 años, 9 meses por almendron.
Viendo 14 respuestas - de la 1 a la 14 (de un total de 14)
  • safe_mode ha desaparecido de las opciones de PHP desde hace más de cinco años.

    Advertencia: Esta característica ha sido declarada OBSOLETA desde PHP 5.3.0 y ELIMINADA a partir de PHP 5.4.0.

    http://php.net/manual/es/features.safe-mode.php

    Pero como WordPress aunque recomienda PHP 7+, soporta desde 5.2.4, lo ideal sería primero recuperar la versión de PHP y si es menor de 5.3 entonces ejecutar la función, sino saltarse dicha comprobación, ya que en caso contrario aparecerá el Warning avisando de que dicha opción está obsoleta o eliminada según la versión de PHP, ya desde marzo del 2012

    Moderador almendron

    (@almendron)

    @carloslongarela : gracias por la sugerencia.

    Lo curioso del caso es que no sale ninguna advertencia ni provoca error alguno. Eso me hace suponer que la variable devuelve un valor false al no existir safe_mode.
    El problema es que no podemos saltarnos la comprobación ya que la función «is_safe_mode» es utilizada después en otras partes del plugin.

    ¿Y si cambio el código y lo dejo así?

      /**
       * blcUtility::is_safe_mode()
       * Checks if PHP is running in safe mode
       *
       * @return bool
       */
    	static function is_safe_mode(){
    		$safe_mode = 'false';
                    ..................
    		return (bool)(int)$safe_mode;
    		}
    	}
    
    • Esta respuesta fue modificada hace 6 años, 9 meses por almendron.
    • Esta respuesta fue modificada hace 6 años, 9 meses por almendron.

    Yo haría (código «de memoria», sin comprobar):

    
      /**
       * blcUtility::is_safe_mode()
       * Checks if PHP is running in safe mode
       *
       * @return bool
       */
    	static function is_safe_mode(){
                    if ( version_compare( phpversion(), '5.3', '<' ) ) {
                       $safe_mode = ini_get( 'safe_mode' );
                    } else {
                        $safe_mode = false;
                    }
    		
    		//Null, 0, '', '0' and so on count as false 
    		if ( !$safe_mode ) return false;
    		//Test for some textual true/false variations
    		switch ( strtolower($safe_mode) ){
    			case 'on':
    			case 'true':
    			case 'yes':
    				return true;
    				
    			case 'off':
    			case 'false':
    			case 'no':
    				return false;
    				
    			default: //Let PHP handle anything else
    				return (bool)(int)$safe_mode;
    		}
    	}
    
    Moderador almendron

    (@almendron)

    Muchas gracias Carlos. En cuanto lo compruebe te digo algo (será ya mañana).
    Un saludo.

    El if mejor:

    if ( version_compare( phpversion(), '5.3.0', '<' ) ) {

    Moderador LGrusin

    (@lgrusin)

    Lo que yo no entiendo es cómo el autor del plugin no se ha dado cuenta de estas cosas. Según parece la última actualización ha sido de hace 3 semanas, no es mucho tiempo.

    @almendron sería interesante comunicarselo.

    Un saludo

    Moderador almendron

    (@almendron)

    En la última actualización solo fue para cambiar algo relativo a la información: «Información actualizada del plugin». En realidad lleva un año sin actualizar. Creo que cambió de desarrollador.

    Y tiene más problemas. Otro ya lo he puesto aquí. Y también hay otro relacionado con el motor de almacenamiento ya que el plugin no funciona si pones las tablas en InnoDb.

    Todo esto ya lo he ido poniendo en el soporte del plugin pero de momento ni caso.

    Lo malo es que se trata de un plugin bastante necesario.

    Pues si no responde el actual dev, un fork del plugin, arreglo de todo tipo de bugs y nueva versión 😉

    Moderador almendron

    (@almendron)

    Ya me gustaría pero mis conocimientos no llegan a tanto 🙂

    Bueno, a ver si es developer responde, sino nos lo planteamos, yo código, otro pruebas, otros bugs, otro la apariencia del backend 😉

    • Esta respuesta fue modificada hace 6 años, 8 meses por Carlos Longarela. Razón: syntax
    Moderador almendron

    (@almendron)

    Por mi encantado porque es un plugin genial. Cuenta conmigo.

    Moderador almendron

    (@almendron)

    Ya he hecho las pruebas cambiando el código y de momento todo correcto.

    El problema es que antes ya no daba mensaje de error y ahora sigue sin darlo. Lo que puse al principio del hilo es de alguien que comprobó con alguna utilidad si el plugin era compatible con PHP 7.

    Incluso he puesto un par de «echos» para que devuelva el valor que toma la variable pero no me salen por ningún sitio.

    Os dejo el código que usa la función is_safe_mode():

    //Redirects don't work when safe mode or open_basedir is enabled.
    if ( !blcUtility::is_safe_mode() && !blcUtility::is_open_basedir() ) {
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    }
    //Safe_mode status
    if ( blcUtility::is_safe_mode() ){
    	$debug['Safe mode'] = array(
    		'state' => 'warning',
    		'value' => __('On', 'broken-link-checker'),
    		'message' => __('Redirects may be detected as broken links when safe_mode is on.', 'broken-link-checker'),
    	);
    } else {
    	$debug['Safe mode'] = array(
    		'state' => 'ok',
    		'value' => __('Off', 'broken-link-checker'),
    	);
    }
    // Check for safe mode
    if( blcUtility::is_safe_mode() ){
        // Do it the safe mode way - obey the existing max_execution_time setting
        $t = ini_get('max_execution_time');
        if ($t && ($t < $max_execution_time)) 
        	$max_execution_time = $t-1;
    } else {
    		  // Do it the regular way
    		  @set_time_limit( $max_execution_time * 2 ); //x2 should be plenty, running any longer would mean a glitch.
    		}

    Cambios enviados en https://github.com/ManageWP/broken-link-checker/pull/30 aunque ya le han enviado otros pull requests hace unos seis meses y no los han incorporado, el código con las modificaciones en https://github.com/CarlosLongarela/broken-link-checker si no incorporan el pull se puede continuar a partir de aquí 🙂

    Moderador almendron

    (@almendron)

    Pues sí que lo has cogido con ganas 🙂

    Creo que solo falta resolver el hecho de que no funcione con tablas InnoDB. El error es el siguiente:
    1) Compruebas por ejemplo un enlace que el plugin te ha dado como «advertencia».
    2) Comprueba que ahora es correcto y muestra «Ok».
    3) Sin embargo, no cambia su estado en la tabla correspondiente. Así, si ahora buscas ese mismo enlace te encuentras con que está pendiente de revisar.

    En resumen: no guarda los cambios en el estado del enlace.

Viendo 14 respuestas - de la 1 a la 14 (de un total de 14)
  • El debate ‘Broken Link Checker » PHP 7 Warnings’ está cerrado a nuevas respuestas.