Archivos de Categoría: PHP @es

Arreglar “There is no suitable CSPRNG installed on your system” en Plesk

Después de actualizar paragonie/random_compat puede que te aparezca ese error. Esto se debe a que a partir de la versión 2.0 se dejó de usar OpenSSL y ahora se usa /dev/urandom que puede que no sea leíble por tu configuración de PHP. Esto se soluciona añadiendo /dev/urandom a tu configuración de open_base en “Websites & Domains -> PHP Settings -> open_basedir”:

plesk-open_basedir-dev-urandom

Ref: http://forum.odin.com/threads/how-to-change-php-open_basedir-in-plesk-10-4-4.259102/
https://forum.owncloud.org/viewtopic.php?t=34286
https://github.com/paragonie/random_compat/issues/99

Añadiendo soporte para PHP 7.0 en Plesk

Lo primero que hay que hacer es actualizar Plesk a la version 12.5 (actualmente la 12.5.30). Para ello hay que ir a la sección Server y luego a “Plesk->Updates and Upgrades” y ahí a “Install or Upgrade Product”. Puede que te aparezcan ciertos avisos si es que has instalado módulos de otras partes que no sean de Plesk por lo que sería mejor desinstalarlos antes de hacer la actualización (a mí me sucedió mod_security). Como se puede ver yo ya me he actualizado a las versión 12.5.30 y por tanto no puedo mostrar la imagen exacta pero las opciones son las mismas.

upgrade_plesk_product

Una vez actualizado Plesk la magia, en sistemas Linux, se realiza con éste comando (ejecutado como root):

# plesk sbin autoinstaller --select-product-id plesk --select-release-current --install-component php7.0

El proceso completo de instalación de PHP 7.0 se puede ver aquí: http://pastebin.com/UjH9g4Ak

Lo bueno de todo ésto es que se pueden instalar diferentes versiones de PHP a la vez con tan solo cambiar el número de la versión, así que por ejemplo se puede instalar PHP 5.2 para un dominio en el que la app necesita una versión antigua de PHP:

# plesk sbin autoinstaller --select-product-id plesk --select-release-current --install-component php5.2

Ahora ya se puede seleccionar la versión específica de PHP que acabamos de instalar en los diferentes dominios en la opción “PHP Settings”. Así se ve antes:

php_before

Cambiado a la versión PHP 7.0:

php_70_change

Y después:

php_after

Ref: https://kb.odin.com/en/127701
https://kb.odin.com/en/125146

Instalar PHP 7.0 en Mac OS X con MacPorts

He usado este proceso para instalar PHP 7.0 con MacPorts junto con PHP 5.6.

Primero asegurarse de que el Apache que viene junto con Mac OS X está parado:

$ sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist

Instalar PHP7 y algunos de sus módulos (la lista completa de módulos disponibles aquí):

$ sudo port install php70
$ sudo port install php70-apache2handler php70-cgi php70-gd php70-curl php70-intl php70-iconv php70-gettext php70-mbstring php70-imap php70-mcrypt php70-xmlrpc php70-mysql php70-openssl php70-sockets php70-zip php70-tidy php70-opcache php70-xsl php70-sqlite

Crear el fichero php.ini base a partir del ejemplo de development:

$ sudo cp /opt/local/etc/php.ini-development /opt/local/etc/php.ini

Averiguar la timezone actual y configurarla en php.ini:

$ TIMEZONE=`sudo systemsetup -gettimezone | awk '{ print $3 }'`
$ TIMEZONE=$(printf "%s\n" "$TIMEZONE" | sed 's/[][\.*^$/]/\\&/g')
$ sudo sed -i.bak "s/;date.timezone =/date.timezone = \"${TIMEZONE}\"/g" php.ini

Actualizar los sockets de MySQL si es que se está usando:

$ sudo sed -i.bak "s#pdo_mysql\.default_socket.*#pdo_mysql\.default_socket=`/opt/local/bin/mysql_config --socket`#" php.ini
$ sudo sed -i.bak "s#mysqli\.default_socket.*#mysqli\.default_socket=`/opt/local/bin/mysql_config --socket`#" php.ini

Ahora con este comando se pueden ver las versiones de PHP instaladas:

$ sudo port select --list php
Available versions for php:
	none
	php56 (active)
	php70

Seleccionar php70 como la versión activa de PHP:

$ sudo port select php php70
Selecting 'php70' for 'php' succeeded. 'php70' is now active.

Habilitar PHP 7 en Apache:

$ cd /opt/local/apache2/modules
$ sudo /opt/local/apache2/bin/apxs -a -e -n php7 mod_php70.so

Reiniciar Apache:

$ sudo /opt/local/etc/LaunchDaemons/org.macports.apache2/apache2.wrapper restart

Se puede comprobar la versión de php en la consola así:

$ php -v
PHP 7.0.0 (cli) (built: Dec 12 2015 11:18:35) ( NTS )
Copyright (c) 1997-2015 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2015 Zend Technologies
    with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies

Si la versión que se muestra no es la 7.0 asegurarse de que la ruta /opt/local/bin está definida antes que /usr/bin en la variable PATH:

$ echo $PATH
/opt/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

También asegurarse de que /opt/local/bin/php está apuntando a /opt/local/bin/php70:

$ $ ls -l /opt/local/bin/php
lrwxr-xr-x  1 root  admin    20B Dec  5 23:25 /opt/local/bin/php -> /opt/local/bin/php70

Si al ejecutar phpinfo(); no aparece la versión 7.0 comprobar que solo el módulo 7.0 es cargado en /opt/local/apache2/conf/httpd.conf:

#LoadModule php5_module        modules/mod_php56.so
LoadModule php7_module        modules/mod_php70.so

php7

Aumentar el tamaño máximo de fichero que se puede subir en PHP

A veces necesitas aumentar el tamaño máximo de fichero que se puede subir en PHP que por defecto es 2 megabytes.

php_upload_max_filesize

Dicho tamaño máximo está determinado por 2 valores en PHP:

  • Tamaño máximo de fichero a subir: upload_max_filesize
  • Tamaño máximo de una petición Post: post_max_size

Por eso es importante que ambos valores tengan un valor correcto en php.ini:

upload_max_filesize = 32M
post_max_size = 32M

Unserialize cadenas de textos con caracteres especiales

Después de varias horas teniendo problemas con objetos serializados que tenían textos en español dentro encontré la siguiente función en magp.ie que funcionó perfectamente:

function mb_unserialize($string) {
    $string = preg_replace_callback(
        '!s:(\d+):"(.*?)";!s',
        function ($matches) {
            if ( isset( $matches[2] ) )
                return 's:'.strlen($matches[2]).':"'.$matches[2].'";';
        },
        $string
    );
    return unserialize($string);
}

Por ejemplo:

var_dump(mb_unserialize('O:8:"stdClass":1:{s:4:"text";s:12:"áéíóúñ";}'));

class stdClass#1 (1) {
  public $text =>
  string(12) "áéíóúñ"
}

php