与正在运行的php进程交互

时间:2015-05-05 05:17:52

标签: php

我想知道是否有一种方法可以将循环中的代码作为一个进程运行,并从另一个脚本与它进行交互。我知道套接字监听传入的请求,但是我指的是内部使用,没有请求。

5 个答案:

答案 0 :(得分:2)

标准方法:

使用pcntl-signal()posix-kill()函数通过标准或用户定义的信号进行交互。

优点:

  • PHP内置,随时可用的功能。无需重新发明轮子。
  • POSIX兼容性。

缺点:

  • 您只能将定义的信号发送到脚本。不是价值观。
  • 单向互动。

收听脚本示例:

<?php
pcntl_signal(SIGTERM, 'sig_handler');
pcntl_signal(SIGUSR1, 'sig_handler');

echo 'Run... PID: ' . getmypid() . PHP_EOL;

$finish = false;
while (!$finish) {
    pcntl_signal_dispatch();
}

echo 'Shutdown...' . PHP_EOL;

function sig_handler($signal) {
    global $finish;
    echo 'Received signal: ' . $signal . PHP_EOL;
    switch ($signal) {
        case SIGTERM:
            $finish = true;
        break;
        case SIGUSR1:
            echo 'Processing SIGUSR1 signal...' . PHP_EOL;
        break;
    }
}

非标准方法:

您可以使用数据库,文件,套接字,管道等工具实现与脚本的交互。

优点:

  • 功能仅取决于实现。

缺点:

  • 您需要实现交互协议并在脚本中支持它。

答案 1 :(得分:1)

我首先要说你设置你的脚本在后台运行。您可以自己实现它(使用fork)或使用现有库。 https://www.google.co.jp/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=php%20daemon

然后定义要通信的协议。根据您的需要,有很多方法可以实现,从简单到复杂。

例如,一种简单的方法是在服务器中的某个位置定义脚本定期读取的文件夹(循环+睡眠)。添加文件时,脚本会读取它,执行其中的指令并删除它。

答案 2 :(得分:0)

不,你不能直接访问另一个正在运行的脚本,因为每个脚本都运行它自己的资源sandbox(内存,文件描述符)。您还需要知道它的PID才能访问它,之后,您需要一些黑客工具才能进入该流程空间。

答案 3 :(得分:0)

这可能无法满足您的要求。但是会起作用:

尝试将状态记录到第一个脚本中的文本文件,并从第二个脚本中经常读取它,以了解第一个脚本的当前状态。

答案 4 :(得分:-1)

当php进程启动时,它会将所有需求用于示例变量链接页面等等。并在完成执行后显示结果,并且在完成执行后,你不能做任何事情,只能重新执行。

它喜欢在月球上野餐并在结束后回到家中,所以当你在野餐时没有人可以打扰你。 :D