4

我有一个简短的 php 实用程序脚本,我只需使用以下命令从 cli 运行它:

php myscript.php

该脚本始终在运行,定期执行一些任务(与问题无关)。它不需要用户的任何输入。运行后,我通常按CTRL+z然后运行bg将进程置于后台,一切都很好。

如果我将其运行为:

php myscript.php &

该脚本在启动时置于后台,但它也处于停止状态。例子:

[1] 11513
[1]+  Stopped                 php myscript.php

即使bg在这一点上运行也无济于事,我必须运行fg,然后CTRL+zbg再次使其工作。

这是 php 脚本:

<?
while(true){
    echo 'hi '.time()."\n";
    sleep(30);
}
?>

我的问题是我不能直接在后台运行它,因为系统停止了它,我不明白为什么。我怎样才能解决这个问题?

更新:

我制作了相同脚本的 bash 版本,它可以运行并置于后台(运行而不是停止),只需在末尾加上 & (script.sh &

脚本.sh:

#!/bin/bash
while true; do
    echo `date`
    sleep 30
done

为什么 php 脚本在后台启动后停止,而 bash 脚本没有?什么可能导致这种不同的行为?

4

3 回答 3

20

我找到了导致问题的原因。在 PHP 中,如果启用了 readline 模块,任何命令行脚本都将期待输入,即使脚本被写入为不等待用户输入。

要检查您是否启用了 readline 支持,只需运行:

php --info |grep "Readline Support"

并检查输出。如果你得到Readline Support => enabled了,那么你已经启用了 readline,你可能会遇到原始问题中描述的问题。

使用 cli 的正确方法是明确指定 php 不使用终端进行输入:

php myscript.php < /dev/null &

更多信息: http: //php.net/manual/en/book.readline.php

备择方案:

./test.php >/dev/null &    

或(更有创意):

nohup php test.php > /dev/null 2>&1 &

(ps:我还是相信这个问题属于ServerFault,顺便说一句..问题解决了!)

于 2013-07-29T16:40:10.647 回答
0

通常,您发送到后台的进程&和脚本等待来自终端的输入,进入停止状态。

例如有一个 bash 脚本valecho

#!/bin/sh
read val
echo $val

运行它:

./valecho &

脚本将停止。

当运行它时

echo hello | ./valecho &

将正确运行并完成。

所以,检查你的 php - 可能需要一些输入stdin

编辑- 基于评论:

我不是 php 开发人员 - 但只是尝试了下一个脚本 ( p.php)

<?php
    while(true){
        echo 'hi '.time()."\n";
        sleep(3);
    }
?>

使用命令:

php -f p.php &

并且运行良好...所以...抱歉混淆...

于 2013-07-28T23:32:36.477 回答
0

http://php.net/manual/en/book.readline.php

启用 readline 后,php 会切换终端模式以接受行缓冲输入。这意味着当您通过管道传递到交互式命令时,使用 cli 的正确方法是明确指定 php 不使用终端进行输入:

php myscript.php < /dev/null &

资源

于 2013-08-08T16:23:17.050 回答