php-fpm не работает exec, system, shell_exec, только CLI
php-fpm
, nginx
exec при использовании .phpfiles()
shell_exec()
system()
отлично работает из командной строки.
Пример, когда работает хорошо:
#php myphp.php
myphp.php
содержит:
<?php
exec('ping -c 3 google.com', $output);
print_r($output);
?>
Но если я поставлю на свой браузер http://localhost/myphp.php
, это больше не работает.
Есть идеи? Я редактирую
Я сделал файл со следующим содержанием:
#cat info.php
<?php
if(function_exists('exec')) {
echo "exec is enabled";
}
phpinfo();
?>
В моем браузере распечатать
exec включен, y php info..
Я сделал файл со следующим содержанием:
#cat info.php
<?php
// Check for safe mode
if( ini_get('safe_mode') ){
// Do it the safe mode way
echo "Do it the safe mode way";
}else{
// Do it the regular way
echo "Do it the regular way";
}
?>
В моем браузере распечатать
Делай это обычным способом
Разве я не хотел знать, нахожусь ли я в тюрьме?
В моем php ini
#cat /etc/php-5.5.ini
safe_mode не отображается, либо ON, либо OFF. просто не существует
4 ответа
Я думаю, что exec и подобные функции отключены в вашем php.ini. Вы можете проверить это по
if(function_exists('exec')) {
echo "exec is enabled";
} else {
echo "exec is disabled";
}
Откройте ваш php.ini и перейдите в раздел disable_functions
Если exec указан там, удалите его.
Затем перезагрузите php-fpm
,
Также, если включен безопасный режим, эта функция будет недоступна. Вы должны отключить это.
редактировать
используйте полный путь для пинга. Вы можете найти его, введя эту команду в оболочке which ping
редактировать
<?php
exec('/sbin/ping -c3 google.com', $output);
print_r($output);
?>
<?php
//echo "Вот-вот... ещё 1 мин";
//echo "Wait... 1 min";
echo exec('/bin/bash --login -c "cd /var/www/194.7.2.2/public && /usr/local/rvm/rubies/ruby-2.5.3/bin/ruby work1.rb "'.$_GET['some_value']);
Это сработало 4me!
Php-fpm по умолчанию привязан к OpenBSD. Это, вероятно, причина, по которой вы видите, что он работает в сети, а не в сети.
У вас есть два решения. Отключить chroot (прокомментируйте строку chroot = /var/www
на /etc/php-fpm.conf
) или исправьте проблемы, с которыми вы можете столкнуться.
Статически скомпилированная версия ping находится в /bin/ping
(изнутри chroot). Вам нужно будет скопировать /etc/hosts
а также /etc/resolv.conf
внутри chroot, чтобы разрешить имена хостов (как вы пытаетесь сделать пинг Google). Все остальные системные команды, которые вы планируете вызывать, также должны быть скопированы в chroot (вместе с их общими библиотеками или скомпилированы статически).
использование ldd(1)
чтобы узнать, какие библиотеки вам понадобятся. В зависимости от того, чего вы пытаетесь достичь, это может быть утомительной работой.
Exec, system и shell_exec, вероятно, отключены, как отмечали другие пользователи.
Потратив несколько часов на отладку. это разрешило мины.
Редактировать
/etc/php/7.4/fpm/pool.d/www.conf
Раскомментируйте и настройте эти строки:
env[PATH] =/usr/local/bin:/usr/bin:/bin:/add_your_executable_files_path_here
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp
Перезапустите php-fpm
service php7.4-fpm restart
Окружающая среда
nginx, php-fpm7.4, debian 9.13