从PHP向后台运行的Python脚本发送参数
我有一个python脚本(analyze.py),它将文件名作为参数并对其进行分析。完成分析后,它将等待另一个文件名。我想做的是:从PHP向后台运行的Python脚本发送参数,php,python,python-2.7,background-process,python-daemon,Php,Python,Python 2.7,Background Process,Python Daemon,我有一个python脚本(analyze.py),它将文件名作为参数并对其进行分析。完成分析后,它将等待另一个文件名。我想做的是: 将文件名作为参数从PHP发送到Python 在后台运行analyze.py作为守护进程,文件名来自PHP 我可以将PHP中的参数作为命令行参数发布到Python中,但无法将参数发送到已经在后台运行的Python脚本中 有什么想法吗?这里最明显的答案是: 对每个文件名运行一次analyze.py,而不是将其作为守护进程运行 在启动时传递analyze.py一整套文件名
有什么想法吗?这里最明显的答案是:
analyze.py
,而不是将其作为守护进程运行analyze.py
一整套文件名,而不是一次只传递一个文件名- 通过从(PHP)父进程写入Python脚本,使用Python脚本的标准输入传递数据。(我不知道如何在PHP中实现这一点,甚至不知道这是否可能,但在Python、sh和许多其他语言中都非常简单,所以…)
- 打开TCP套接字、Unix套接字、命名管道、匿名管道等,将一端给Python子级,另一端保留在PHP父级中。(请注意,第一个输入实际上只是这个输入的一个特例,标准输入基本上只是子级和父级之间的一个匿名管道。)
- 打开共享内存区域、mmap文件或父级和子级中的类似文件。这可能还需要共享一个信号量,您可以使用它来构建条件或事件,这样子级就可以等待下一个输入
- 使用一些更高级别的API来封装上述内容之一,例如,将Python子级编写为一个简单的HTTP服务(或JSON-RPC或ZeroMQ,或几乎任何您可以在两种语言中找到的好库);让PHP代码启动该服务并作为客户端发出请求
- 以下是我所做的
PHP部分:
<?php
$param1 = "filename";
$command = "python analyze.py ";
$command .= " $param1";
$pid = popen( $command,"r");
echo "<body><pre>";
while( !feof( $pid ) )
{
echo fread($pid, 256);
flush();
ob_flush();
}
pclose($pid);
?>
工作起来很有魅力。有什么原因不能为每个文件名重新启动Python脚本?对此,有时有很好的答案(例如,Windows上的进程启动开销可能是一秒钟的一个重要部分,如果每个文件只需要20毫秒处理,那么为每个文件使用单独的进程将是愚蠢的),但是如果没有,为什么不保持简单呢?(同时也打开了并行处理的大门,等等)我不能重新启动这个过程,因为它有一些培训内容。经过培训后,它进入分析过程。培训必须在python脚本开始运行时完成。这太棒了。非常感谢你。我使用JSON-RPC作为HTTP服务编写了python脚本。它就像一个符咒:)@AsımSinanYüksel:嗯,那很快令人惊讶的是,现在做高级解决方案是多么容易。你应该能够将JSON-RPC/HTTP客户端直接嵌入到你的PHP中,而不是将其作为一个单独的服务来编写……但是,如果这样做有效,并且你能够在半个小时内毫无问题地编写它,那么很难对成功提出异议。:)
1. I used [JSON-RPC]: https://github.com/gerold-penz/python-jsonrpc to
create a http service that wraps my python script (runs forever)
2. Created a http client that calls the method of http service.
3. Printed the results in json format.