Here is my problem, I have a Python script that will be running indefinitely in a while(1)
loop. I want some PHP script to somehow interact with the Python script, and when it does, the script needs to perform a function with the data submitted to the script.
Any ideas would be appreciated!
You can use redis (pub/sub feature for example) as interprocess communication facility.
Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache and message broker. It supports data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs and geospatial indexes with radius queries. Redis has built-in replication, Lua scripting, LRU eviction, transactions and different levels of on-disk persistence, and provides high availability via Redis Sentinel and automatic partitioning with Redis Cluster.
Besides of IPC via redis you can use it as distributed key-value database - big advantage of redis imho.
Another choice - zeromq - one of most known tools for interprocess communication. There is many tutorials and docs about it on internet. Original guide: http://zguide.zeromq.org/page:all
ØMQ (also known as ZeroMQ, 0MQ, or zmq) looks like an embeddable networking library but acts like a concurrency framework. It gives you sockets that carry atomic messages across various transports like in-process, inter-process, TCP, and multicast. You can connect sockets N-to-N with patterns like fan-out, pub-sub, task distribution, and request-reply. It's fast enough to be the fabric for clustered products. Its asynchronous I/O model gives you scalable multicore applications, built as asynchronous message-processing tasks. It has a score of language APIs and runs on most operating systems. ØMQ is from iMatix and is LGPLv3 open source.
Hello world server and client on python: https://learning-0mq-with-pyzmq.readthedocs.org/en/latest/pyzmq/patterns/client_server.html
Simple example of PHP server and python client from official guide:
PHP server:
<?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]
", $request);
// Do some 'work'
sleep (1);
// Send reply back to client
$responder->send("World");
}
Hello World client in Python:
#
# 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)
Use xml-rpc.
Expose your python object and consume it from PHP using some xmlrpc client. Security is up to you. ;)
Php example at: http://pear.php.net/manual/en/package.webservices.xml-rpc.examples.php
Python doc at: http://docs.python.org/2/library/xmlrpclib.html
If the same machine, you can use file with command. Create a file cmd.txt , python will read it in loop every sec, Php script will write a command in file cmd.txt , python will do the job and erase the command from cmd.txt
I would use Twisted to turn the Python code into a service which can then be called by your PHP code.
See example code at http://twistedmatrix.com/trac/
You can use python's SimpleHTTPServer
in your python script to run the server forever on some port. Then your PHP code can interact with python on HTTP. Both scripts dont need to be on the same host. You can look here for more on this