这是我的问题,我有一个Python脚本,它将在while(1)
循环中无限期运行。我想要一些PHP脚本以某种方式与Python脚本交互,当它发生时,脚本需要使用提交给脚本的数据执行一个函数。
任何想法都将不胜感激!
答案 0 :(得分:5)
您可以使用redis(例如,pub / sub功能)作为进程间通信工具。
Redis是一种开源(BSD许可),内存数据结构 store,用作数据库,缓存和消息代理。它支持数据 结构,如字符串,散列,列表,集合,排序集合 范围查询,位图,超级日志和地理空间索引 半径查询。 Redis具有内置复制,Lua脚本,LRU 驱逐,交易和不同级别的磁盘持久性, 并通过Redis Sentinel自动提供高可用性 使用Redis Cluster进行分区。
除了通过redis进行IPC之外,您还可以将其用作分布式键值数据库 - 这是redis imho的一大优势。
另一种选择 - zeromq - 用于进程间通信的最着名工具之一。互联网上有很多关于它的教程和文档。原始指南:http://zguide.zeromq.org/page:all
ØMQ(也称为ZeroMQ,0MQ或zmq)看起来像一个嵌入式 网络库,但就像一个并发框架。它给你 在各种传输中携带原子消息的套接字 进程内,进程间,TCP和多播。您可以连接套接字 N-to-N具有扇出,发布子,任务分配等模式 请求 - 应答。它足够快,可以成为集群的结构 产品。其异步I / O模型为您提供可扩展的多核 应用程序,构建为异步消息处理任务。它有一个 语言API的得分,并在大多数操作系统上运行。 ØMQ来自 iMatix和LGPLv3开源。
python上的Hello world服务器和客户端:https://learning-0mq-with-pyzmq.readthedocs.org/en/latest/pyzmq/patterns/client_server.html
官方指南中PHP服务器和python客户端的简单示例:
PHP服务器:
<?php
/*
* Hello World server
* Binds REP socket to tcp://*:5555
* Expects "Hello" from client, replies with "World"
* @author Ian Barber <ian(dot)barber(at)gmail(dot)com>
*/
$context = new ZMQContext(1);
// Socket to talk to clients
$responder = new ZMQSocket($context, ZMQ::SOCKET_REP);
$responder->bind("tcp://*:5555");
while (true) {
// Wait for next request from client
$request = $responder->recv();
printf ("Received request: [%s]\n", $request);
// Do some 'work'
sleep (1);
// Send reply back to client
$responder->send("World");
}
Python中的Hello World客户端:
#
# Hello World client in Python
# Connects REQ socket to tcp://localhost:5555
# Sends "Hello" to server, expects "World" back
#
import zmq
context = zmq.Context()
# Socket to talk to server
print "Connecting to hello world server…"
socket = context.socket(zmq.REQ)
socket.connect("tcp://localhost:5555")
# Do 10 requests, waiting each time for a response
for request in range(10):
print "Sending request %s …" % request
socket.send("Hello")
# Get the reply.
message = socket.recv()
print "Received reply %s [ %s ]" % (request, message)
答案 1 :(得分:1)
使用xml-rpc。
展开你的python对象并使用一些xmlrpc客户端从PHP中使用它。安全取决于你。 ;)
Php示例:http://pear.php.net/manual/en/package.webservices.xml-rpc.examples.php
Python doc at:http://docs.python.org/2/library/xmlrpclib.html
答案 2 :(得分:1)
您可以在python脚本中使用python的SimpleHTTPServer
在某个端口上永久运行服务器。然后你的PHP代码可以在HTTP上与python交互。两个脚本都不需要在同一主机上。您可以在此
答案 3 :(得分:0)
如果是同一台机器,则可以使用带命令的文件。创建一个文件cmd.txt,python将每秒循环读取它,Php脚本将在文件cmd.txt中写入命令,python将执行该操作并从cmd.txt中删除命令
答案 4 :(得分:0)
我会使用Twisted将Python代码转换为可以由PHP代码调用的服务。
上的示例代码