exec и shell_exec не работают в php

У меня проблемы с exec и shell_exec. Я просмотрел все сообщения здесь и не могу найти проблему. код, который я использую:

chdir('/');
$handle = shell_exec("/usr/bin/php /home/donor/public_html/batch/testlaunch.php 2>&1");
echo $handle .":". gettype($handle) . "\n";
$read = fread($handle, 2096);
echo $read;

экран выглядит так:

...
X-Powered-By: PHP/5.3.21 Content-type: text/html (repeated about 100 times)
X-Powered-By: PHP/5.3.21 Content-type: text/html 
PHP Warning: shell_exec() [function.shell-exec]: Unable to execute '/usr/bin/php /home/donor/public_html/batch/testlaunch.php 2>&1' in /home/donor/public_html/batch/test.php on line 4 X-Powered-By: PHP/5.3.21 Content-type: text/html 
Warning: shell_exec() [function.shell-exec]: Unable to execute '/usr/bin/php /home/donor/public_html/batch/testlaunch.php 2>&1' in /home/donor/public_html/batch/test.php on line 4
:boolean PHP Warning: fread() expects parameter 1 to be resource, boolean given in /home/donor/public_html/batch/test.php on line 6 
Warning: fread() expects parameter 1 to be resource, boolean given in /home/donor/public_html/batch/test.php on line 6
:string PHP Warning: fread() expects parameter 1 to be resource, string given in /home/donor/public_html/batch/test.php on line 6 (repeated another 100ish times)

Безопасный режим PHP отключен. Разрешения для папки, в которой находятся файлы .../batch/ и /usr/bin/php, установлены на 755. Пользователь для всех файлов один и тот же, за исключением php (пользователь файла php - root). В файле php.ini ничего не отключено. Отлично работает в CLI. и простые команды, такие как whoami и ls, работают нормально. я чувствую, что я что-то упускаю

РЕДАКТИРОВАТЬ: попробовал то, что сказал cpattersonv1, и получил:

X-Powered-By: PHP/5.3.21 Content-type: text/html sh: fork: retry: Resource temporarily unavailable sh: fork: retry: Resource temporarily unavailable sh: fork: retry: Resource temporarily unavailable sh: fork: retry: Resource temporarily unavailable X-Powered-By: PHP/5.3.21 Content-type: text/html sh: fork: retry: Resource temporarily unavailable sh: fork: retry: Resource temporarily unavailable sh: fork: retry: Resource temporarily unavailable sh: fork: retry: Resource temporarily unavailable sh: fork: Resource temporarily unavailable X-Powered-By: PHP/5.3.21 Content-type: text/html 2540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

РЕДАКТИРОВАТЬ 2: кто-нибудь знает, почему похоже, что он пытается выполнить команду более одного раза?

РЕДАКТИРОВАТЬ 3: я поместил команду в файл .sh и попытался запустить ее. работает в CLI, но опять же не работает из php

chdir('/');
$handle = exec(". /home/donor/public_html/batch/test.sh");

Я получаю тот же результат;


person briandonor    schedule 02.04.2013    source источник
comment
что вы получаете, когда используете var_dump($handle)   -  person m79lkm    schedule 03.04.2013
comment
X-Powered-By: PHP/5.3.21 Content-type: text/html string(641) X-Powered-By: PHP/5.3.21 Content-type: text/html string(573)   -  person briandonor    schedule 03.04.2013


Ответы (4)


Вместо этого попробуйте сквозной доступ, таким образом, нет никаких ограничений на выполнение, если это займет некоторое время:

<?php

 passthru("/usr/bin/php /home/donor/public_html/batch/testlaunch.php 2>&1",$pass_result);
 echo $pass_result; 

?>

или это:

<?php

 passthru("/usr/bin/php /home/donor/public_html/batch/testlaunch.php",$pass_result,$error);
 echo $pass_result; 
 echo $error; 

?>
person AbsoluteƵERØ    schedule 02.04.2013

Попробуйте добавить пользователя вашего веб-сервера в группу с разрешениями rw для пакетного каталога. Либо как root, либо с помощью sudo:

usermod -G groupname username

затем в пакетном каталоге:

chmod -R g+w batch
person m79lkm    schedule 02.04.2013
comment
вам не нужно будет использовать chmod, потому что ваши права уже 755 - person m79lkm; 03.04.2013
comment
если я даю ему права на запись, это дает мне внутреннюю ошибку сервера, когда я захожу на страницу, а пакетная папка уже является донором-донором, который является веб-пользователем. - person briandonor; 03.04.2013
comment
читая ваш пост еще раз, я заметил, что ваш shell_exec указывает на /usr/bin/php, и вы ссылаетесь на /bin/php в своем описании. Используйте «какой php», чтобы узнать расположение php на вашем сервере. - person m79lkm; 03.04.2013
comment
извините, я просто сократил его, это должно быть /usr/bin/php, вот что говорят все php-процессы на сервере «менеджер процессов» - person briandonor; 03.04.2013
comment
возможно, есть еще один каталог, которому мне тоже нужно дать разрешения? - person briandonor; 03.04.2013
comment
у кого ты его запускал как в кли? - person m79lkm; 03.04.2013
comment
я запускал его в оболочке как донор - person briandonor; 03.04.2013

видимо, я использовал неправильный файл/путь php>‹ как манекен, спасибо за помощь, ребята

person briandonor    schedule 02.04.2013

Хотя это старый пост, вот мой ответ другим пользователям.

  1. Измените каталог на исполняемый путь
  2. Вызовите shell_exec() без указания пути к исполняемому файлу.
  3. Верните каталог обратно в исходный (чтобы не мешала какая-то другая часть кода).

Пример

$current_dir = getcwd();
$executable_dir = "\executables\";
chdir($executable_dir);

$output1 = shell_exec("executable.exe file_to_run.ext $parameter_to_pass");
var_dump($output1);

chdir($current_dir);
person luvlogic    schedule 27.08.2014
comment
Примечание для других пользователей: обратите внимание на \" в конце второй строки: это экранирование двойных кавычек и выдаст ошибку. Замените ` with /` (в Linux) или, что еще лучше, используйте константу DIRECTORY_SEPARATOR следующим образом: DIRECTORY_SEPARATOR . "executables" . DIRECTORY_SEPARATOR - person Erenor Paz; 12.07.2021