Categoría: Cómo hacer para…

Estos artículos te explicarán cómo resolver problemas específicos usando PHP

  • Cómo manipular imágenes usando PHP

    Cómo manipular imágenes usando PHP

    ImageMagick es una aplicación muy potente para la manipulación de imágenes. Por lo general, se utiliza desde la línea de comandos en ambientes Linux.

    ImageMagick es capaz de trabajar con una amplia variedad de formatos de imágenes y realizar una gran cantidad de transformaciones sobre ellas.

    PHP cuenta con una API propia para que su utilización sea sencilla (Obviamente, requiere que primero se instalen las bibliotecas necesarias): la clase Imagick.

    Una instancia de Imagick trabaja asociándole una o más imágenes al momento de su construcción (pasándole un string o un array según el caso):

    $ig = new \Imagick("mi_imagen.jpg");
    
    $ig2 = new \Imagick( ["mi_imagen.jpg", "otra_imagen.png"]);

    A partir de ese momento es posible realizar modificaciones a la imagen simplemente invocando los métodos de la clase, por ejemplo:

    $ig->resizeImage( $width, $height, \Imagick::FILTER_BOX, 0.9 );

    Permite redimensionar la imagen al tamaño que se desee (aplicando en el proceso diferentes filtros y borroneos (blur).

    Es importante tener en cuenta que todo este procesamiento sucede en memoria, de esa forma es posible emitir el resultado directamente hacia la salida:

    header("Content-Type: image/jpg");
    echo $ig->getImageBlob();

    O almacenarlo en un archivo:

    $ig->writeimage( "nueva_imagen.jpg" );

    Ahora ya podés hacer que tu aplicación recorte el avatar de tus usuarios (o mejor, que les baje un poco la calidad para limitar su tamaño).

    ¿Qué otras cosas querrías hacer con las imágenes de tu aplicación?

  • Cómo alterar la configuración de PHP sin acceder al php.ini

    Cómo alterar la configuración de PHP sin acceder al php.ini

    En el servidor no tengo acceso a php.ini (alojamiento gratuito) por lo que debo configurar los cambios a través de “.htaccess”.

    La configuración estándar de PHP no siempre es la adecuada para nuestras aplicaciones (Por ejemplo, la cantidad de memoria permitida para un script o el tiempo máximo de ejecución).

    Desafortunadamente, no siempre podemos hacerlo del modo normal, es decir, modificando el archivo php.ini.

    Es más, existen casos en los que no querremos que estos cambios tengan efecto en scripts diferentes del que estamos desarrollando.

    El típico caso en que esto sucede es un entorno de hosting compartido.

    Algunos proveedores dan acceso a una versión particular del archivo por cada sitio que alojan, aunque la mayoría no lo permiten en absoluto (Es lógico si se piensa un poco, un servidor en el que corren muchas aplicaciones debe hacer un gran esfuerzo por evitar que un vecino poco solidario acapare los recursos del sistema o lo vuevla inestable).

    En estas situaciones, algo que podemos hacer es utilizar la función ini_set.

    Esta función permite alterar algún parámetro de la configuración por espacio del hilo de ejecución actual (Es decir, el cambio no tendrá efecto en otros scripts que se estén ejecutando simultáneamente ni una vez finalizada la ejecución en curso).

    Algunos ejemplos interesantes:

    Parámetros de sesión

    La directiva session.name especifica el nombre de la cookie de sesión que usará nuestra aplicación. Es muy importante ponerle un nombre único para evitar dar a un potencial atacante información que facilitaría su tarea (Por ejemplo, al dejar el nombre por defecto, PHPSESSION, el agresor ya sabe que nuestra aplicación está desarrollada en PHP)

    Zona horaria

    Algo muy útil cuando se trabaja con usuarios de diferentes lugares del mundo (O cuando el hosting está en una zona horaria diferente de la del usuario) y se requiere hacer cálculos de fecha/hora. Más detalles acá.

    Remitente de correos por defecto

    La directiva sendmail_from permite definir la dirección de email desde la que se enviarán los correos de nuestro script.

    Una aclaración importante: no todas las directivas de PHP pueden modificarse usando esta función.

    Acá está la lista completa.

  • Cómo consumir un WebService SOAP con PHP

    Cómo consumir un WebService SOAP con PHP

    Qué son los WebServices

    Los WebServices son un mecanismo muy útil para integrar aplicaciones a través del protocolo HTTP, y de ese modo, aprovechar las capacidades de terceros dentro de nuestras propias aplicaciones.

    Un ejemplo muy común es de las pasarelas de pago, como ser PayPal o MercadoPago.

    Se basan siempre en la existencia de dos procesos:

    • El cliente (Consumidor)
    • El servidor (Productor)

    A nivel técnico existen dos operaciones que pueden realizarse a través de WebServices:

    1. Consumirlos
    2. Exponerlos

    Uno de los protocolos que pueden utilizar los WebServices es SOAP (Otro muy común es REST).

    Consumirlos usando PHP es bastante simple, para ello se utiliza la clase SoapClient.

    Cómo obtener la localización del visitante usando su IP

    Para este ejemplo usaremos el WebService de cdyne.com para obtener información geográfica en base a la IP buscada.

    <?php
    
    $url = "http://ws.cdyne.com/ip2geo/ip2geo.asmx?wsdl";
    
    try {
     $client = new SoapClient($url, [ "trace" => 1 ] );
     $result = $client->ResolveIP( [ "ipAddress" => $argv[1], "licenseKey" => "0" ] );
    
     print_r($result);
    } catch ( SoapFault $e ) {
     echo $e->getMessage();
    }
    
    
    echo PHP_EOL;

    En este caso, este script debería ser corrido desde CLI.

    Por ejemplo, si lo guardás como «ws.php», al ejecutar php ws.php 210.45.151.101 obtendrás la salida:

    stdClass Object
    (
     [ResolveIPResult] => stdClass Object
     (
     [City] => Huainan
     [StateProvince] => 01
     [Country] => China
     [Organization] => 
     [Latitude] => 32.6264
     [Longitude] => 116.9969
     [AreaCode] => 0
     [TimeZone] => 
     [HasDaylightSavings] => 
     [Certainty] => 90
     [RegionName] => 
     [CountryCode] => CN
     )
    )

    Como podrás observar, la respuesta del método ResolveIP es un objeto de tipo StdClass.

    StdClass es una clase genérica de PHP (Algo medio raro y, casi diría que un abuso de la naturaleza interpretada del lenguaje). Esta clase no tiene métodos ni propiedades definidas, pero sirve como una especie de contenedor al que se le puede asignar arbitrariamente todo lo que uno quiera (En rigor de verdad, esto puede hacerse con cualquier clase de PHP, sólo que es preferible no hacerlo).

    Básicamente, al construir el cliente a partir de la definición de un WSDL están disponibles todos los servicios expuestos como métodos propios (como si estuviesen accesibles en forma local, a pesar de que la verdadera llamada es remota).

    Es interesante notar esto, si ves la línea $result = $client->ResolveIP( [ "ipAddress" => $argv[1], "licenseKey" => "0" ] ); podrás notar que se está invocando al método ResolveIP sobre un objeto de clase SoapClient.

    La clase SoapClient es una clase estándar de PHP, mientras que el método ResolveIP sólo tiene sentido dentro de este WebService. Si te estás preguntando cómo puede una clase estándar reconocer métodos desconocidos te diría que deberías darle una mirada al tema de los métodos mágicos de PHP (O tomar el curso de PHP Orientado a Objetos).

    Como te imaginarás, si existe la clase SoapClient… debe existir la clase SoapServer (Tema de otro post).

    En el curso de PHP WebServices estudiamos este tema en mayor profundidad, mientras tanto, si te quedó alguna duda podés dejarla en un comentario.

  • Cómo evitar la inyección SQL  en PHP

    Cómo evitar la inyección SQL en PHP

    Uno de los fantasmas más temidos por quienes contratan servicios de desarrollo (especialmente cuando se trata de su primera experiencia) es el de los ataques de hackers.

    Si bien es imposible asegurar al 100% un sistema (de software o de cualquier otro tipo), existe una serie de buenas prácticas que disminuyen sensiblemente la probabilidad de ocurrencia de tales ataques (o al menos, su probabilidad de éxito).

    Por lo general, los ataques se basan en la explotación de código vulnerable como ser algún caso raro que el desarrollador no tuvo en cuenta.

    Uno de los ataques más usuales es el conocido como sql injection.

    De lo que se trata es de ejecutar código sql sin autorización.

    Los scripts de PHP que no están bien escritos pueden ser atacados de esta forma.

    Veamos un ejemplo:

    <?php
    
    $sql = "SELECT * FROM users WHERE nombre = '".$_POST['nombre']."'";
    
    $db->query($sql);

    Si el $_POST se llena normalmente no habría problema (Si lo hace un usuario legítimo de nuestra aplicación), pero… ¿qué pasa si un usuario malicioso lo hace?

    Por ejemplo, qué tal si alguien pusiera algo como esto en el campo nombre:

    ';DROP TABLE users;--

    El sql total quedaría así:

    SELECT * FROM users WHERE nombre = '';DROP TABLE users;--'

    Por si lo querés ver más gráfico, te dejo este excelente comic.

    Bueno… formas de protegerse de esto hay muchas, una muy práctica es utilizar los prepared statements de PDO.

    El ejemplo quedaría de esta forma:

    <?php
    
    $sql = "SELECT * FROM users WHERE nombre = :nombre";
    $st = $db->prepare( $sql );
    $st->execute( [ ':nombre' => $_POST['nombre'] ] );

    De este modo, dejamos en manos de PDO la realización de las validaciones y el agregado de comillas donde corresponda, de modo que el sql a ejecutar quede de esta forma:

    SELECT * FROM users WHERE nombre = '\';DROP TABLE users;--\''

    Con lo cual se vuelve completamente inofensivo 🙂

  • Cómo evitar la expiración de las sesiones en PHP

    Cómo evitar la expiración de las sesiones en PHP

    En un proyecto que hice para un cliente me sucedió algo que no había previsto: un formulario dinámico resultó muy largo para la persona que tenía que realizar la carga y, cuando terminó el sistema la deslogueó automáticamente y perdió su trabajo 🙁

    Analizando un poco el problema me di cuenta de que la sesión había expirado a pesar de que el usuario estaba interactuando con el sistema… sólo que no se estaba produciendo ninguna comunicación cliente-servidor, ya que toda la acción estaba pasando del lado cliente.

    A juzgar por algunos comentarios que he leído por ahí, como:

    Tengo un archivo sesion.php que se incluye en cada pagina del proyecto, para validar tanto si la sesión esta activa, como si la sesión ha expirado, estoy haciendo pruebas con 30 segundos para no tardar tanto.

    El problema surge que el código se ejecuta cada vez que visito una pagina, por lo tanto si estoy navegando sobre la misma pagina, como por ejemplo haciendo click o registrando datos, la sesión aún así expira.

    O también:

    Tengo mi web en un servidor de GoDaddy y manejo sesiones pero estas caducan solas por inactividad..

    Parece que no estoy solo en este sufrimiento 🙂

    La solución que encontré fue diseñar un mecanismo de tipo keepAlive de modo de avisar al servidor que todavía había actividad del lado del cliente (¡y pedir por favor que no me dejen afuera!).

    Lo primero que hice entonces fue agregar este pequeño código javascript:

    <script type="text/javascript">
        var keep_alive = false;
    
        $(document).bind("click keydown keyup mousemove", function() {
            keep_alive = true;
        });
    
        setInterval(function() {
            if ( keep_alive ) {
                pingServer();
                keep_alive = false;
            }
        }, 1200000 );
    
        function pingServer() {
            $.ajax('/keepAlive');
        }
    </script>

    La idea es llevar un control sobre cualquier evento que se suceda del lado cliente (Click, presionar una tecla o mover el mouse) y, cada tanto (20 minutos en mi caso), si hubo actividad, avisarle al server para prolongar la vida de la sesión.

    Cómo extender dinámicamente la vida de una sesión

    Del lado del servidor no hay mucho que hacer en realidad, basta con tener algún script que responda a la URI /keepAlive (Preferentemente con un 200 OK) y listo.

    Hay algunas otras cosas a tener en cuenta si, como en mi caso, la aplicación está corriendo en un ambiente de hosting compartido (Algo que trato de evitar por todos los medios, pero bueno… en este caso no pude):

    1. Dónde se almacena la información de las sesiones propias de la aplicación
    2. Cuál es el tiempo de vida de la sesión
    3. Cada cuánto tiempo se libera la basura de las sesiones

    La respuesta a estas tres preguntas (y otras más) está en el viejo y querido php.ini. Específicamente en las claves:

    Como cualquier otro setting de php, puede modificarse desde el propio código de nuestra aplicación (¡Pero hay que acordarse de hacerlo!).

    Un detalle interesante es esta notita sobre session.gc_maxlifetime:

    Nota: Si diferentes scripts tienen diferentes valores de session.gc_maxlifetime pero comparten la misma ubicación para almacenar la información de sesión, la información del script con el mínimo valor será limpiada. En este caso use esta directiva junto con session.save_path.

    No puedo estar seguro al 100%, pero mi apuesta más fuerte es que este fue el problema: mi aplicación estaba guardando sus archivos de sesión en el mismo lugar que otra y, cuando pasó el garbage collector… ¡adiós!

    ¿Tuviste alguna vez problemas de este tipo con tus aplicaciones web?

  • Cómo conectarse a bases de datos distintas de MySQL desde PHP

    Cómo conectarse a bases de datos distintas de MySQL desde PHP

    Si bien es casi una redundancia hablar de PHP+MySQL (Algo así como GNU y Linux), la realidad es que esta santa asociación es casi casual.

    En PHP no existe un motor de base de datos preferido y otros de segunda. No voy a decir que PHP puede conectarse a cualquier motor de bases de datos (Habiendo pasado por la FCEyN aprendí bien a no usar los absolutos con ligereza :)), la realidad es que puede conectarse, de forma muy simple, a una amplia cantidad.


    A su vez, las opciones son varias, dependiendo principalmente del nivel técnico de quien deba implementar la solución. Paso a explicar:

    En el escalón más bajo están las funciones propias de php para realizar las conexiones:

    Y un largo etcétera (Si tenés que conectarte a una base de datos diferente de estas, podés encontrar información útil acá).

    Este es el modo de realizar la conexión si estás buscando programar en modo procedural o estructurado.

    Si estás un poco más ducho y buscás un modo de realizar tus conexiones usando objetos, podés usar PDO. Al usar esta interfase, las cosas se hacen mucho más simples (Particularmente cuando se trata de migrar a otro motor, ya que lo único que cambia es el string con el que establecés la conexión).

    Un ejemplo de conexión a un SqlServer que está en un servidor identificado como DB_SERVER:

    <?php
    
    try {
      $conexion = new PDO("sqlsrv:Server=DB_SERVER;Database=midb", "Usuario", "Contraseña");
    } catch ( PDOException $e ) {
      echo $e->getMessage();
    }
    • Y una vez que tenés las conexión lista, las operaciones se realizan del mismo modo si se trata de un MySQL, SqlServer, Oracle, etc…
    •  
    • Por último, si estás realmente decidido a llevar el tema a su máximo nivel, te recomiendo usar algún ORM (Si me preguntás a mí, con Doctrine deberías andar muy bien).

    ¿Te quedó alguna duda? ¡Posteala en los comentarios!

  • Cómo mostrar resultados de un proceso largo en tiempo real en una aplicación web

    Cómo mostrar resultados de un proceso largo en tiempo real en una aplicación web

    Un caso interesante en el que me tocó trabajar fue la implementación de un sistema de gamification para una red social de viajeros en la que trabajaba.

    Los responsables del producto estaban muy interesados en fomentar la generación de contenido por parte de los usuarios del sitio y se les ocurrió que ofrecer «galardones» a quienes más contenido subían a la plataforma era una buena forma de lograrlo.

    Dejando de lado la discusión sobre la viabilidad de la estrategia, hay unas cuantas lecciones interesantes desde el punto de vista de la implementación técnica.

    Algo de información de contexto:

    1. Las reglas de obtención de los galardones no eran triviales (Tampoco eran super complejas, básicamente, según el tipo de contenido de que se trataba había un número mínimo de aportes que permitían alcanzar el siguiente nivel y ese número iba aumentando, haciendo que alcanzar los niveles más elevados fuera mucho más difícil que los primeros).
    2. Era muy importante dar satisfacción inmediata al usuario que hiciera aportes.

    Dimos muchas vueltas respecto de cómo lograr esto, que implicaba la actualización de contadores en una base de datos relativamente grande, la evaluación de las reglas y el rendering del mensaje adecuado para la situación que el usuario acababa de generar.

    La solución que encontramos fue hacer un pequeño truco: hicimos el cálculo en el FrontEnd y en el BackEnd:

    Lo primero que hacíamos era enviar la información que el cliente necesitaría para galardonar al usuario en caso de ser necesario (las reglas de cálculo de los galardones y el estado actual de la cuenta del usuario) y luego asentábamos ese cambio en la base de datos.

    De esta forma logramos que el usuario tuviera su cucarda al momento exacto en que cruzaba el umbral y, a la vez, que el resultado no se perdiera.

    Esta es una forma más de tratar con procesos largos que, en un entorno de usuarios impacientes (como es una red social), funciona muy bien :).

    Un tiempo más tarde leí que Apple había usado un truco similar para lograr que el IPhone mostrara la lista de aplicaciones disponibles al momento en que el teléfono se encendía: tenían pre-calculada una imagen estática que se mostraba mientras la aplicación terminaba de cargar.

    Siempre me gustaron estos ejemplos de combinación de ingeniería con cierta picardía (como el de los espejos en el hotel de ascensores lentos).

    ¿Tenés algún otro ejemplo de cómo tratar con este tipo de situación?

  • Cómo mostrar progreso de procesamiento en un entorno Web

    Cómo mostrar progreso de procesamiento en un entorno Web

    Cuando se requiere tratar con un proceso largo se presenta un problema. Existen varias alternativas (algunas las discutíamos acá).

    Idependientemente de cuál sea la estrategia elegida, el objetivo es siempre el mismo: evitar que el visitante se aburra (o piense que la aplicación se colgó o algo parecido).

     

    Algo que hasta hace un tiempo era impensable (o al menos muy poco práctico) era la posibilidad de ir mostrando progreso a medida que el procesamiento avanza.

    El truco se compone de tres partes:

    1. El front end
    2. El script del lado del servidor que ejecuta el proceso
    3. El script que reporta el progreso obtenido hasta el momento

    Del lado del frontend se usa Ajax (y probablemente jQuery o algún otro framework JavaScript) para disparar la acción, algo como:

    <input type="button" id="trigger" />
    <div id="progreso" style="visibility: hidden">
      <p id="mensaje"></p>
    </div>
    <script type="text/javascript">
    $('#trigger').click(function(){
     $.post(
      'iniciarProceso.php',
      {
        param: value
      },
      function( data ) {
       $('#mensaje').text('Proceso iniciado...');
       $('#progreso').show();
      }
     );
    })
    </script>

    Con esto hemos logrado que el proceso se inicie (y que al visitante se le muestre un mensaje indicador).

    Para completar nuestro cometido necesitamos contar con algún mecanismo que consulte periódicamente en qué estado está el proceso (lo que se conoce como polling) y un servicio (del lado del servidor) que pueda brindar la información requerida:

    Del lado del cliente será algo como:

    <script type="text/javascript">
    function pollServer()
    {
     $.get(
      'processStatus.php',
      {
        param: value
      },
      function( data ) {
       $('#mensaje').text( 'Porcentaje de avance: ' + data.percent );
      } 
     );
    }
    
    setTimeOut( pollServer, 2000 );
    </script>

    Con este código se está solicitando una actualización de progreso al servidor cada 2 segundos (y mostrando el resultado al usuario).

    Veamos ahora cómo debería ser el código de processStatus.php:

    <?php
    header('Content-Type: text/javascript');
    $percent = calculateProgress(); // Probablemente esto consultara a la BD o a algun otro registro de progreso
    
    echo json_encode($percent);
    ?>

    La clave de este sencillo proceso es la definición del header (De modo que el cliente entienda que recibe datos en un formato compatible con el request realizado vía Ajax).

    Obviamente, se pueden hacer implementaciones mucho más vistosas (Por ejemplo usando Bootstrap o mostrando imágenes en lugar de mensajes) pero la base de este mecanismo es esta.

    ¿En qué casos creés que te serviría usar esta técnica?

  • Cómo tratar con procesos largos en PHP

    Cómo tratar con procesos largos en PHP

    Antes de meternos en los detalles distingamos dos escenarios:

    1. PHP dentro del contexto de un WebServer
    2. PHP como lenguaje de scripting de algún proceso off-line.

    Cuando se trata del segundo caso, es posible que existan oportunidades de mejorar el tiempo que insume el proceso, pero, en la gran mayoría de los casos, no pasará de ser una pequeña molestia si no se consigue este objetivo.

    Cuando estamos en el contexto de WebServer, la molestia puede ser tal que haga que nuestros visitantes abandonen el sitio (Para no regresar jamás).

    Por otro lado, es de suponer que en un ambiente web la concurrencia es alta (Es decir, un script PHP que está ejecutando está compitiendo contra muchos otros similares a él por el uso de los recursos), con lo cual, el propio sistema suele tomarse algunos recaudos para evitar que muchos inocentes sufran por los desmanes de unos pocos alborotadores :).

    Uno de los límites que se nos impone (desde el archivo php.ini) es el tiempo máximo de ejecución (Que normalmente está en los 30 segundos).

    Pero eso es lo que el servidor soporta antes de determinar que nuestro script tarda demasiado… los usuarios reales tienen mucha menor tolerancia (Hay estudios que afirman que una demora de más de 4 segundos hace que el 75% de los visitantes pierdan la paciencia…).

    Entonces… ¿cómo atacar este problema?

    Como diría Zun Tzu, la mejor manera de salir vivo de una batalla es no entrar nunca (No sé si eso es exactamente lo que dijo, pero si no, seguro que pensaba algo parecido :)).

    Llevado al mundo de la programación web, la primera pregunta que debe hacerse es: ¿es realmente necesario ejecutar este proceso consumidor de tiempo?. Aunque parezca una trivialidad, en muchas ocasiones la respuesta es un rotundo NO, y simplemente se hace por razones que pueden haber sido válidas tiempo atrás pero ya no lo son más.

    La siguiente pregunta (Asumiendo que la respuesta a la primera haya sido SI) es: ¿es realmente necesario ejecutar este proceso ahora mismo?. Esta es una pregunta un poco más sutil, pero sumamente importante. Para responderla hay que pensar mucho sobre lo que significa «ahora mismo»: el momento en que se está ejecutando PHP en un WebServer es cuando se ha recibido una petición de un usuario y se está intentando generar una respuesta.

    Aquí nos metemos un poco en temas de psicología más que de programación, pero vale la pena intentarlo: muchas veces un usuario preferirá una respuesta rápida y casi correcta (o que parezca correcta) antes que una respuesta perfecta pero retrasada.

    Se puede pensar en esto como en un truco de magia (un acto de ilusionismo si se quiere), donde es más importante lo que se ve que lo que efectivamente sucede.

    Un típico ejemplo de estos problemas los constituye el recálculo de contadores. Tomo a Facebook como ejemplo, si te fijás en los números que indican la cantidad de actualizaciones no leídas podrás notar que rara vez es correcto… sin embargo, ¿cuál es el riesgo de tener un número ligeramente diferente del real? ¿estarías dispuesto a esperar más para tener la tranquilidad de que el número es correcto?

    En la mayoría de los casos, con que eventualmente los números cierren no habrá mayores problemas, lo cual da lugar a un esquema de solución muy utilizado: diferir la ejecución de procesos largos.

    ¿Cómo se logra esto? Una forma artesanal de hacerlo es guardar en algún medio de almacenamiento (por ejemplo una base de datos), toda la información necesaria para realizar el cálculo en cuestión, devolver al usuario algo que le de tranquilidad y, mediante algún mecanismo offline (un cronjob por ejemplo), terminar los trabajos que se dejaron a la mitad.

    Otro modo de resolverlo (un poco más profesional) es utilizar algún sistema de procesamiento de trabajos en paralelo, por ejemplo Gearman.

    ¿Qué otras alternativas se te ocurren para resolver este problema?

  • Cómo probar tus scripts PHP sin instalar un intérprete

    Cómo probar tus scripts PHP sin instalar un intérprete

    No sé si te pasará lo mismo, pero para mi, la posibilidad de escribir (y probar) código sin necesidad de tener mi propia computadora a mano es muy seductora.

    He probado CodeAnyWhere y está bastante cerca de lo que me gustaría, pero todavía (2017) le falta un poco… imagino que para 2020 será la opción de facto… por el momento hay que conformarse con opciones un poco menos sofisticadas (o llevar la compu a cuestas… lo que prefieras).

    Pero bueno, cuando se trata de tirar algún comando rápido, hacer alguna prueba de concepto o simplemente matar unos minutos libres, acá te dejo algunas opciones interesantes:

    Run Write PHP Online

    Una interfase muy bonita, bien pulida y, lo mejor, interpreta mientras escribís y te da la salida (o el error) inmediatamente.

    (Me comenta mi amigo @MySelfCoding que este no va más… una pena :'( )

    WritePHPOnline

    Un poco menos profesionale que el anterrior, la interfase no es tan limpia, pero bueno… cumple con su cometido.

    Tiene un lindo cheatsheet de funciones php que puede venirte bien.

    PHPFiddle

    Esta es una opción que no conocía, por lo que se ve, parece querer ser un competidor de CodeAnywhere… aunque está bastante lejos de lograrlo… para investigarlo un poco.

    PHPTester

    También, una herramienta algo rústica, pero que cumple.

    Permite elegir la versión del intérprete.

    RunPHPOnline

    Muy similar a PHPTester, con la UI algo más pulida.

    ¿Qué otras opciones conocés para testear código PHP rápidamente?