I don't think you're going to get Apache to hand you the socket.

However, you can write a program using the standalone (CGI) PHP 
interpreter that will act like a server - check out 
http://php.net/socket_create_listen for more info.

You could redirect from your standard web server to your listening PHP app
running on another port. You'll then have to implement at least a subset
of the HTTP protocol in order to get browsers to talk to you. 

Unfortunately, since you can't - to the best of my knowledge - fork a PHP
program, you're going to have to do your own homebrew threading which will
make life slightly complicated.


On 22 May 2002, Vinod  Panicker wrote:
> It still seems like I havent made the problem clear enough.
> I am aware of the print(), echo() and flush() functions and what 
> they do.  It does not fit in as a solution.  Let me explain my 
> problem more elaborately -
> The client calls a PHP script, script_a.php on the Apache web 
> server, using a Keep-Alive connection.  The script returns some 
> response to the client which it uses.  Now since the connection is 
> a Keep-alive, apache still has it open for reading and writing.  
> When the client wants to call other scripts, it just sends the 
> request over the same connection.  Now the thing is that if the 
> server needs to send some ASYNCHRONOUS data to the client, without 
> the client requesting for anything, a normal PHP script wont be 
> able to do it, since the script would get executed by the web 
> server ONLY on a client request (coz thats the way HTTP works).  
> Now what i was thinking was - if i could get hold of the socket 
> that is being used by apache to send data to the client, I could 
> effectively write() to it, from a C++ app or a PHP script (which 
> gets invoked from lets say another server).  print(), echo() etc 
> are functions that write to the output stream, which is opened as 
> a result of the clients request, by the web server.
> I want the ability to write to a socket thats been created earlier 
> - i want to steal it from Apache, so that i can use it when and 
> where i like.
> Functions like echo() and print() are not going to work here, i 
> will have to use write() so that i can specify the socket to which 
> the data has to be written!
> Hope the problem is understood now.
> Now for your question -
> When the client wants to send data to the server, it just has to 
> open a socket connection with the web server, and issue a GET or a 
> POST request!  if the connection is a keep-alive connection, and 
> it has already been created, the client just has to do a GET or a 
> POST without the need to connect().
> This mechanism, where the client frequently connects() to the 
> server and checks for messages is called polling.  One way of 
> reducing the high overhead of this is to reuse the connection by 
> using a keep-alive connection.  A still better improvement would 
> be to remove the need for a poll altogether, by doing something 
> (thats what my question is all about) on the server so that it can 
> send data asynchronously to the server.
> Tx,
> Vinod.
> On Wed, 22 May 2002 Bogdan Stancescu wrote :
> >For your specific problem, I think Mr. Lemos has provided a 
> >viable solution (using print() or echo() and flush() whenever you 
> >need to, instead of grabbing the socket and write() to it). My 
> >problem however is how you envision solving the communication the 
> >other way around (i.e. when the CLIENT wants to send data to the 
> >server).
> >
> >Bogdan
> >
> >Vinod Panicker wrote:
> >
> >>Hi,
> >>
> >>Tx for your very prompt reply.
> >>
> >>Yeah, I'll post the solution as soon as I find it someplace.
> >>
> >>Let me outline the problem in more detail -
> >>
> >>Client (VC++) calls a PHP script on the server, specifies the 
> >>connection type as Keep-Alive.  The PHP script, somehow (still a 
> >>big question) gets the socket on which the apache server has 
> >>received the client request (so that it can send data to the 
> >>client later) and stores it in a database.
> >>
> >>Now whenever another PHP script wants to send data 
> >>asynchronously to the client, it gets the socket from the 
> >>database, and just calls a write() on it.  Since the connection 
> >>is still open (Keep-Alive), the client receives the information, 
> >>and doesnt have to poll the server periodically.
> >>
> >>The application of this is indeed destined for a messaging 
> >>product, and could benefit a lot of other areas as well.
> >>
> >>The only thing that is needed is the socket from apache.
> >>
> >>Someone somewhere knows how to get this done, i'm sure :)
> >>
> >>Possibly a hack into the PHP module can get this done, i'm open 
> >>to suggestions.
> >>
> >>Tx,
> >>Vinod.
> >>
> >>On Tue, 21 May 2002 Bogdan Stancescu wrote :
> >>
> >>>Hi!
> >>>
> >>>I'm looking for an answer to your questions as well, so if you 
> >>>do find a solution on other lists, could you please post it 
> >>>here as well?
> >>>
> >>>Regarding the issue, your proposal wouldn't make for 
> >>>full-duplex as far as I understand since I don't see how the 
> >>>client would be able to send any data on the same connection 
> >>>_after_ getting connected.
> >>>
> >>>What are you using on the other end of the pipe (on the 
> >>>client)? Plain HTML? Flash? Java? Something else?
> >>>
> >>>Bogdan
> >>>
> >>>Vinod Panicker wrote:
> >>>
> >>>>Hi,
> >>>>
> >>>>We have developed a client-server application where the server 
> >>>>needs to send asynchronous data to the client.  Now since we 
> >>>>are using Apache/PHP/MySQL, the client needs to poll the 
> >>>>server periodically for information.
> >>>>
> >>>>I was thinking if there was some way to get around this basic 
> >>>>problem.  I understand that this is how things are supposed to 
> >>>>work, but it would be just great if i could PUSH data from the 
> >>>>server to the client, using HTTP.
> >>>>
> >>>>Since HTTP is a request/response based protocol, Apache would 
> >>>>not send any data to the client asynchronously.  So what i was 
> >>>>thinking was - If i tell the server to allow Keep-Alive 
> >>>>connections, and increase the timeout value and max requests, 
> >>>>I would effectively have a constant TCP connection.  Now the 
> >>>>only problem would be of sending asynchronous data to the 
> >>>>client.  Solution?  Here goes - If there was some way in which 
> >>>>i could get hold of the file descriptor(socket) that is being 
> >>>>used by apache to write data to the client, then i could, from 
> >>>>a PHP script also send any data to the client using the socket 
> >>>>functions of PHP since i already have the socket with me.
> >>>>
> >>>>This would mean that the client doesnt have to poll the server 
> >>>>for data any more... and if the connection does get closed, 
> >>>>the client could reconnect to the server asking for another 
> >>>>keep-alive connection.
> >>>>
> >>>>Now I know that this is probably the wrong place to put such a 
> >>>>query - maybe the apache list would have been better.  But 
> >>>>since I'm using PHP out here, i thought i'd give it a try.
> >>>>
> >>>>Does the solution sound very outlandish?  Are there any 
> >>>>pitfalls?  And finally, how do i get hold of the socket?
> >>>
> >
> >
> >
> >
> >-- PHP General Mailing List (http://www.php.net/)
> >To unsubscribe, visit: http://www.php.net/unsub.php
> >
> _________________________________________________________
> Click below to visit monsterindia.com and review jobs in India or 
> Abroad
> http://monsterindia.rediff.com/jobs

PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to