从PHP发送数据到Python脚本

时间:2013-12-06 16:06:14

标签: php python sockets

这是我的问题,我有一个Python脚本,它将在while(1)循环中无限期运行。我想要一些PHP脚本以某种方式与Python脚本交互,当它发生时,脚本需要使用提交给脚本的数据执行一个函数。

任何想法都将不胜感激!

5 个答案:

答案 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交互。两个脚本都不需要在同一主机上。您可以在此

上查看here了解更多信息

答案 3 :(得分:0)

如果是同一台机器,则可以使用带命令的文件。创建一个文件cmd.txt,python将每秒循环读取它,Php脚本将在文件cmd.txt中写入命令,python将执行该操作并从cmd.txt中删除命令

答案 4 :(得分:0)

我会使用Twisted将Python代码转换为可以由PHP代码调用的服务。

请参阅http://twistedmatrix.com/trac/

上的示例代码