nginx — 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.
просто не существует

5

Решение

Я думаю, что 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);
?>
0

Другие решения

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, вероятно, отключены, как отмечали другие пользователи.

0


<?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!

0
По вопросам рекламы [email protected]