【问题标题】:Sending data to Python Script from PHP [closed]从 PHP 向 Python 脚本发送数据 [关闭]
【发布时间】:2013-12-24 01:41:59
【问题描述】:

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

任何想法都将不胜感激!

【问题讨论】:

  • 两个脚本是否位于同一主机上?
  • 您可能会更好地与数据库进行交互。我不知道如何使用 PHP 与已经运行的 Python 脚本进行交互,除非该 Python 脚本以某种方式侦听传入连接。我们需要您实际尝试做的更多细节。
  • 我认为数据库的想法实际上会很好。也许正在侦听带有 NOT_STARTED 标签的新条目?我正在制造(合法的)邮件轰炸机。用户提交请求,python 脚本执行该请求。当脚本找到新条目时,将启动一个新的邮件炸弹线程。是的,两个脚本都在同一个主机上。
  • 数据类型是什么? JSON?
  • 请澄清一下:数据来自哪个脚本,什么样的数据,有多少项,需要返回什么,需要什么样的响应时间,你多久会调用它?

标签: php python sockets


【解决方案1】:

使用 xml-rpc。

公开你的 python 对象并使用一些 xmlrpc 客户端从 PHP 中使用它。安全由您决定。 ;)

PHP 示例位于:http://pear.php.net/manual/en/package.webservices.xml-rpc.examples.php

Python 文档地址:http://docs.python.org/2/library/xmlrpclib.html

【讨论】:

  • xml-rpc 有很多编码/解码开销;取决于他的数据类型有多复杂,这可能不值得。
【解决方案2】:

如果是同一台机器,可以使用file with command。创建一个文件 cmd.txt ,python 会每秒循环读取它,Php 脚本会在文件 cmd.txt 中写入一个命令,python 会完成这项工作并从 cmd.txt 中删除命令

【讨论】:

    【解决方案3】:

    我会使用 Twisted 将 Python 代码转换为服务,然后您的 PHP 代码可以调用该服务。

    http://twistedmatrix.com/trac/查看示例代码

    【讨论】:

    • 你不会因为只使用服务部分而扭曲太多。 Python 已经有 http 和 xmlrpc 服务器,它们不需要像扭曲一样多的阅读。
    【解决方案4】:

    您可以使用redis(例如发布/订阅功能)作为进程间通信工具。

    Redis 是一种开源(BSD 许可)的内存数据结构 store,用作数据库、缓存和消息代理。它支持数据 结构,例如字符串、哈希、列表、集合、排序集合 范围查询、位图、超日志和地理空间索引 半径查询。 Redis 内置了复制、Lua 脚本、LRU 驱逐、事务和不同级别的磁盘持久性, 并通过 Redis Sentinel 和自动提供高可用性 使用 Redis 集群进行分区。

    除了通过 redis 进行 IPC 之外,您还可以将它用作分布式键值数据库 - redis 恕我直言的一大优势。

    另一种选择 - 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)
    

    【讨论】:

    • ZeroMQ(还有 RabbitMQ)是 MOM(面向消息的中间件)。他们只关心传输消息。由您决定建立一个“协议”,以便知道如何响应消息。
    【解决方案5】:

    您可以在您的python 脚本中使用python 的SimpleHTTPServer 在某个端口上永久运行服务器。然后你的 PHP 代码可以在 HTTP 上与 python 交互。两个脚本不需要位于同一主机上。您可以查看here 了解更多信息

    【讨论】:

      猜你喜欢
      • 2018-07-25
      • 2015-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-13
      • 2020-07-14
      相关资源
      最近更新 更多