Introducción
Cuando un alojamiento ejecuta PHP desde la línea de comandos (tareas cron, wp-cli, scripts de mantenimiento de PrestaShop o Magento, o el enlace php de la carpeta del alojamiento), PHP no usa las opciones configuradas en el alojamiento (memory_limit, upload_max_filesize, etc.). Esas opciones solo se aplican a la parte web, a través del pool PHP-FPM o del virtual host de Apache.
La CLI de PHP lee la configuración del motor PHP: un fichero común a toda la máquina y no asociado a ningún alojamiento. Por eso es frecuente encontrar errores como estos:
PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 20480 bytes)
aparecen en un cron o al lanzar wp-cli, aunque el alojamiento tenga configurado un memory_limit mayor.
Core-Admin permite consultar y cambiar la configuración CLI de cada motor PHP instalado en una máquina. Puede hacerse en remoto, desde el servidor central con crad-cli.pyc, o en local, en la propia máquina con crad-webhosting-mgr.pyc. El cambio afecta solo a la CLI: la configuración web (PHP-FPM / php-cgi) de los alojamientos no cambia.
Requisitos previos
- Core-Admin con el módulo Webhosting Management actualizado en la máquina (incluye los servicios
get_php_engine_cli_configyset_php_engine_cli_option). - Para el uso remoto: acceso a
crad-cli.pyccon un usuario administrador del panel. - Para el uso local: acceso
roota la máquina.
Cómo funciona: php-cli.ini
Los motores PHP de Core-Admin (/usr/core-admin/php/<versión>) leen su configuración de /etc/core-admin/php/<versión>/. Por defecto, la CLI, PHP-FPM y php-cgi comparten el mismo php.ini.
PHP busca primero un fichero específico de su modo de ejecución, php-<sapi>.ini, y solo si no existe usa php.ini. Para la CLI ese fichero es php-cli.ini. Si existe, la CLI lo carga en lugar de php.ini, mientras que PHP-FPM y php-cgi siguen usando php.ini. Los ficheros de conf.d/ (ionCube, opcache, extensiones…) se cargan en ambos casos.
Core-Admin trabaja siempre sobre php-cli.ini:
-
Si no existe, la herramienta lo crea en la primera consulta o modificación como copia de
php.inicon una cabecera explicativa. Recién creado, la CLI se comporta exactamente igual que antes. -
A partir de ahí, todas las consultas y cambios se hacen sobre
php-cli.ini.
| Motor | Fichero que se lee y edita | Referencia (php.ini) |
|---|---|---|
Core-Admin (8.2, 8.3…) |
/etc/core-admin/php/<versión>/php-cli.ini |
/etc/core-admin/php/<versión>/php.ini |
default en Debian/Ubuntu |
/etc/php/<versión>/cli/php.ini (ya es exclusivo de la CLI) |
— |
default en distribuciones RPM |
php-cli.ini junto a /etc/php.ini
|
/etc/php.ini |
Importante: una vez creado
php-cli.ini, los cambios que se hagan después enphp.inino llegan a la CLI. Si modificasphp.inia mano, revisa tambiénphp-cli.ini. La herramienta te avisa cuandophp.inies más reciente quephp-cli.ini.
Gestión remota con crad-cli.pyc
Los motores pertenecen a la máquina y no a un alojamiento, así que hay que indicar siempre la máquina con --machine.
Consultar la configuración CLI de un motor
crad-cli.pyc --show-php-engine-cli=8.3 --machine node04.example.com
Ejemplo de salida:
CLI configuration of PHP engine 8.3 on node04.example.com:
CLI config file : /etc/core-admin/php/8.3/php-cli.ini
Loaded by the CLI : /etc/core-admin/php/8.3/php-cli.ini
php.ini reference : /etc/core-admin/php/8.3/php.ini
PHP binary : /usr/core-admin/php/8.3/bin/php
CLI directives (15):
Directive Set CLI value (php-cli.ini) php.ini value
--------- --- ----------------------- -------------
memory_limit |[*] |512M |128M
display_errors |[*] |Off |Off
date.timezone |[*] |'Europe/Madrid' |'Europe/Madrid'
opcache.enable_cli |[ ] |(not set) |(not set)
...
Qué significa cada campo:
-
CLI config file: el fichero que gestiona la herramienta. Si aparece
(derived now from …), se acaba de crear en esta consulta a partir dephp.ini. -
Loaded by the CLI: el fichero que carga realmente la CLI, según
php --ini. Debe coincidir con el anterior. Si no coincide (por ejemplo, porque alguien definió la variablePHPRC), se muestra en rojo, porque los cambios no tendrían efecto. -
Set:
[*]si la directiva está activa enphp-cli.iniy[ ]si no lo está, en cuyo caso se aplica el valor por defecto de PHP. -
php.ini value: el valor que tiene
php.ini, para comparar de un vistazo qué difiere entre la CLI y la web.
Para consultar una directiva que no está en la lista, y además ver su valor efectivo (el que obtiene la CLI al ejecutarse), añade --option-name:
crad-cli.pyc --show-php-engine-cli=8.3 --machine node04.example.com --option-name=realpath_cache_size
Con --json la salida es JSON, útil para scripts.
Cambiar una directiva
crad-cli.pyc --edit-php-engine-cli=8.2 --machine node04.example.com --option-name=memory_limit --option-value=512M
Setting memory_limit=512M in CLI configuration of PHP engine 8.2 on node04.example.com..OK
PHP engine 8.2 CLI: memory_limit = 512M configured in /etc/core-admin/php/8.2/php-cli.ini, effective value: 512M
La respuesta incluye el valor efectivo que lee la CLI después del cambio, así que confirma que se ha aplicado.
Si la directiva ya tenía ese valor, no se toca el fichero:
PHP engine 8.2 CLI: memory_limit already configured as requested in /etc/core-admin/php/8.2/php-cli.ini, nothing changed
Por eso el comando se puede repetir sin riesgo, por ejemplo al aplicarlo a varias máquinas desde un script.
Restaurar el valor de php.ini
Para que una directiva vuelva a tener en la CLI el mismo valor que en php.ini:
crad-cli.pyc --edit-php-engine-cli=8.2 --machine node04.example.com --option-name=memory_limit --reset-option
En el motor default de Debian/Ubuntu no hay php.ini de referencia, así que la directiva se comenta y pasa a aplicarse el valor por defecto de PHP.
Gestión local con crad-webhosting-mgr.pyc
Las mismas operaciones están disponibles en la propia máquina, como root, con los argumentos en el formato habitual de crad-webhosting-mgr.pyc:
# consultar
crad-webhosting-mgr.pyc --show-php-engine-cli=8.3
# consultar una directiva concreta con su valor efectivo
crad-webhosting-mgr.pyc --show-php-engine-cli=8.3 realpath_cache_size
# cambiar
crad-webhosting-mgr.pyc --edit-php-engine-cli=8.3 memory_limit 1G
# restaurar el valor de php.ini
crad-webhosting-mgr.pyc --edit-php-engine-cli=8.3 memory_limit --reset-option
Si el valor empieza por un guion, como -1 (memoria ilimitada), pon -- antes de los argumentos para que no se interprete como una opción:
crad-webhosting-mgr.pyc --edit-php-engine-cli=8.3 -- memory_limit -1
Ambas opciones aceptan --json.
Valores admitidos
-
Cualquier directiva válida de PHP (
memory_limit,display_errors,error_reporting,date.timezone,disable_functions,opcache.enable_cli…), salvoextensionyzend_extension. Las extensiones se gestionan con sus herramientas propias (PECL, ionCube). -
El valor se escribe tal cual en el ini:
512M,1G,-1,On,Off,E_ALL & ~E_DEPRECATED, rutas, etc. -
Un número sin unidad en
memory_limit,post_max_sizeoupload_max_filesizese interpreta como megabytes, igual que en las opciones de alojamiento:512se guarda como512M. -
Caracteres no permitidos: comillas dobles, saltos de línea y los caracteres
;=${}[].
Directivas que no se pueden cambiar en la CLI
La CLI de PHP fuerza algunos valores después de leer los ficheros ini, así que configurarlos en php-cli.ini no tiene efecto. La herramienta rechaza el cambio y lo explica:
| Directiva | Valor que fuerza la CLI |
|---|---|
max_execution_time |
0 (sin límite) |
max_input_time |
-1 |
html_errors |
0 |
implicit_flush |
1 |
output_buffering |
0 |
register_argc_argv |
1 |
Si un script CLI necesita un límite de tiempo, debe fijarlo él mismo, por ejemplo con set_time_limit ().
Detalles técnicos
Seguridad ante errores
Antes de escribir, la herramienta ejecuta la CLI del motor y anota los avisos de arranque que ya existían. Después escribe el fichero y vuelve a ejecutar la CLI. Si aparece algún aviso nuevo (por ejemplo, un error de sintaxis en el ini), restaura el contenido anterior y devuelve el error. Los avisos que ya estaban antes, como una extensión que falta, no bloquean el cambio.
La escritura es atómica (fichero temporal más renombrado), así que nunca queda un php-cli.ini a medio escribir.
Permisos
php-cli.ini se crea siempre con permisos 0644. Los crons y wp-cli se ejecutan con el usuario del alojamiento, y si el fichero solo fuera legible por root, PHP lo ignoraría sin avisar.
Dónde se escribe el cambio
- Si la directiva ya está activa en el fichero, se sustituye su línea.
-
Si solo aparece comentada (como
;date.timezone =en elphp.inide producción), la nueva línea se añade justo debajo. -
Si no aparece, se añade al final del fichero bajo el comentario
; added by core-admin.
Verificación manual
# fichero que carga la CLI del motor
/usr/core-admin/php/8.3/bin/php --ini
# valor efectivo de una directiva
/usr/core-admin/php/8.3/bin/php -r 'echo ini_get ("memory_limit"), "\n";'
# lo mismo, como el usuario de un alojamiento y con su enlace php
su -s /bin/sh USUARIO -c '/var/webs/example.com/php -r "echo ini_get (\"memory_limit\");"'
Preguntas frecuentes
¿Cambiar la configuración CLI afecta a la web de los alojamientos?
No. PHP-FPM y php-cgi siguen leyendo php.ini, y las opciones de cada alojamiento se aplican igual que antes. Tampoco es necesario reiniciar ningún servicio: cada ejecución de la CLI lee php-cli.ini al arrancar.
He subido el memory_limit del alojamiento y el cron sigue fallando por memoria, ¿por qué?
Las opciones del alojamiento solo se aplican a la web. Los crons y wp-cli usan la configuración CLI del motor. Mira qué motor usa el alojamiento con crad-cli.pyc --show-hosting-php=example.com y ajusta ese motor con --edit-php-engine-cli.
¿El cambio afecta a todos los alojamientos de la máquina?
Sí, a todos los que usan ese motor PHP desde la CLI. Es una configuración del motor, no de un alojamiento.
He editado php.ini a mano y la CLI no ve el cambio.
Si existe php-cli.ini, la CLI ya no lee php.ini. Aplica el cambio también en la CLI con --edit-php-engine-cli. --show-php-engine-cli avisa cuando php.ini es más reciente que php-cli.ini.
¿Puedo volver a la situación anterior, sin php-cli.ini?
Sí. Si borras /etc/core-admin/php/<versión>/php-cli.ini, la CLI vuelve a usar php.ini. Ten en cuenta que la siguiente consulta con --show-php-engine-cli lo volverá a crear como copia de php.ini, lo que no cambia el comportamiento.
¿Por qué la primera modificación dice «nothing changed» si nunca había tocado ese motor?
Porque php-cli.ini se acaba de crear como copia de php.ini y en php.ini la directiva ya tenía el valor pedido. El fichero queda creado igualmente y las siguientes modificaciones se aplican sobre él.
Resumen de opciones
| Operación | Remoto (crad-cli.pyc) |
Local (crad-webhosting-mgr.pyc) |
|---|---|---|
| Consultar | --show-php-engine-cli=8.3 --machine M |
--show-php-engine-cli=8.3 |
| Consultar una directiva y su valor efectivo | ... --option-name=NOMBRE |
--show-php-engine-cli=8.3 NOMBRE |
| Cambiar | --edit-php-engine-cli=8.3 --machine M --option-name=NOMBRE --option-value=VALOR |
--edit-php-engine-cli=8.3 NOMBRE VALOR |
| Restaurar valor de php.ini | --edit-php-engine-cli=8.3 --machine M --option-name=NOMBRE --reset-option |
--edit-php-engine-cli=8.3 NOMBRE --reset-option |
| Salida JSON | --json |
--json |