вызов shell_exec (php myscript.php) переходит в бесконечный цикл

Я решил раскошелиться на свой php-скрипт, потому что он слишком долго выполняется. Когда я запускал вызов shell_exec() на локальной машине с Linux, я не видел проблемы с бесконечным циклом, но на хостинговой машине сценарий зацикливался. Я сократил код до минимума, и я надеюсь, что кто-то может помочь мне увидеть проблему здесь:

Задействовано 3 сценария:
test_shell.php --> вызывает shell_exec() для forkphp.sh --> который выдает команду "path/to/php write_hello_world.php"

начиная сверху вниз, сначала скрипт test_shell.php:

<?php
    if(function_exists('shell_exec')) {
            echo "shell_exec() is enabled";
    }

    $cmd = "./forkphp.sh > /dev/null 2>&1 &";
    echo "<br/> About to shell_exec($cmd)<br/>";
    $out = shell_exec($cmd);
    echo $out;

?>

Вот forkphp.sh:

#!/bin/bash
# About to run /usr/bin/php  write_hello_world.php
echo $(/usr/bin/php write_hello_world.php)

Наконец, вот write_hello_word.php:

<?php
$data = "This is a test : testing \n testing \n ";

file_put_contents ("deleteme.txt",$data);

?>

Получается бесконечный цикл, в котором файл 'deleteme.txt' постоянно перезаписывается. Я только предполагаю, что я, возможно, где-то неправильно использую «$»? Заранее спасибо за помощь.


person seedhom    schedule 22.04.2013    source источник
comment
Какова конечная цель, которой вы пытаетесь служить здесь? На первый взгляд, нет смысла иметь промежуточный сценарий оболочки, вы можете просто вызвать дочерний процесс PHP напрямую. Однако я до сих пор не вижу веской причины для бесконечного цикла с этим - но поскольку файл всегда будет иметь одно и то же содержимое в конце этого, как вы узнаете, что это происходит?   -  person DaveRandom    schedule 22.04.2013
comment
@DaveRandom: я решил раскошелиться на свой php-скрипт, потому что он слишком долго выполняется.   -  person Mr. Llama    schedule 22.04.2013
comment
Я заканчиваю файл с помощью tail -f deleteme.txt и вижу в нем потоковую передачу текста. что касается причины, по которой я делаю это через промежуточный файл, потому что прямой вызов из php-файла в shell_exec() другого php-файла у меня не работал, так что это был способ обойти это   -  person seedhom    schedule 22.04.2013
comment
@GigaWatt По-прежнему нет причин иметь промежуточный сценарий оболочки ...   -  person DaveRandom    schedule 22.04.2013
comment
@seedhom: в write_hello_world.php добавьте microtime(1) в конец $data. Проверьте файл, чтобы увидеть, действительно ли он перезаписывается или это только кажется. Кроме того, возможно, стоит проверить дерево процессов на коробке, чтобы увидеть, что именно запускает.   -  person Mr. Llama    schedule 22.04.2013
comment
Вы на самом деле выполняете не fork   -  person hek2mgl    schedule 22.04.2013
comment
@seedhom: это, вероятно, визуальная ошибка вашего инструмента SSH. file_put_contents перезаписывает файл, поэтому вы не должны видеть несколько строк из tail.   -  person Mr. Llama    schedule 22.04.2013
comment
ps aux показывает процесс forkphp.php, а процесс php write_hello_world.php получает новый PID при каждой проверке ps   -  person seedhom    schedule 22.04.2013
comment
Спасибо за вашу помощь, но просто уточнить; Я использовал промежуточный файл, потому что исходный прямой вызов из первого скрипта в shell_exec(php write_hello_world &) не работал, и мне было интересно, блокирует ли мой хост-провайдер php от использования exec для инициации другого php-файла, поэтому я попробовал это таким образом . Опять же, на моей локальной машине с Linux это работает.   -  person seedhom    schedule 22.04.2013
comment
Вот простой пример проблемы: <?php exec ("php -v"); Зацикливается до сбоя <?php exec ("php -v >> log"); Журнал снова и снова показывает следующее Running X-Powered-By: PHP/5.5.38 Content-type: text/html   -  person Button 108    schedule 02.05.2017


Ответы (1)


Передайте флаг FILE_APPEND в file_put_contents(), иначе файл будет перезаписывается снова и снова:

file_put_contents ("deleteme.txt",$data, FILE_APPEND);
person hek2mgl    schedule 22.04.2013
comment
внесение этого изменения привело к очень быстрому росту файла deleteme.txt! - person seedhom; 22.04.2013
comment
Что-то подобное уже читал в вопросе. Не могу представить, просто увидев код. Сделаю тест на месте. Дайте мне пару минут.... Однако FILE_APPEND требуется в любом случае - person hek2mgl; 22.04.2013
comment
Я не могу воспроизвести вашу проблему. Может быть, ваш реальный код не так прост, как код, который вы опубликовали? - person hek2mgl; 22.04.2013
comment
Кстати, чего вы ожидаете от echo : echo $(/usr/bin/php write_hello_world.php) ? write_hello_world.php ничего не выводит - person hek2mgl; 22.04.2013
comment
Истинный. эхо было просто остатком от моих экспериментов. Нет цели. - person seedhom; 22.04.2013
comment
hek2mgl, что касается простоты кода, то я изменил только имена файлов php. Я верю и надеюсь, что правильно сохранил последовательность вызовов. Теперь у меня есть более сильное убеждение, что мой предоставленный хостинг что-то сделал с shell_exec(), когда это не поведение по умолчанию. - person seedhom; 22.04.2013