Haha, after looking over the enviorment variables one last time I noticed it
was setting the content length to zero, my fault. After fixing this, it
seems to be working! Yay, yet another webserver with php support :)

www.sf.net/projects/ante

Matthew wrote:


> Sara Golemon wrote:
> 
>>> Hello all, I hope this is the right place to write about this. I've been
>>> trying now for quite some time to integrate php into my non-apache
>>> server (completely c++ written by me).
>>>
>> Sounds like you want to use sapi/embed (or write a SAPI implementation of
>> your own which is notably more involved).  Start with Wez's slides to get
>> a general idea, if you have questions later on, you can ask here or on
>> pecl-dev which is more non-core oriented than internals.
>> 
>> -Sara
>> 
>> >
>>http://www.php-kongress.de/2003/slides/internals_track/wez_embedding-php.pdf
> 
> Thank you for the quick response Sara! After looking in to this, I decided
> embedding it in might not be the best option after all. Instead, I decided
> to go with the php-cgi method, and am now facing I believe one last
> problem standing between me and full php in my webserver. I first removed
> the .sh script that's generated, and created my own little p_open that
> pipes stdin/stdout so I can read/write from the server. I export a good
> chunk of enviorment variables (listed below) after the fork in the child
> process before the execl of the php-cgi command, which seem to get most of
> the job done. I can GET php pages just fine (including more advanced
> things like phpBB), but POST is a whole different story, I can't get _ANY_
> post data.
> 
> Now, to do posts, I'm writing the post data onto stdin of the child
> process, which seems to be cgi/1.1 spec. I created my own very tiny c++
> program to test it:
> #include <iostream>
> #include <fstream>
> int main() {
> 
>         std::string x;
>         std::cin >> x; //read from stdin - comes from server
>         std::cout << "Content-Type: text/html" << "\r\n\r\n" << "You
> entered: " << x << std::endl; //write to stdout - piped back to server
>         return 0;
> }
> 
> compiled it, and tested it by sending a post through that program, it
> echo'd the response to the web client containing all the POST data.
> 
> To make sure it was correct, I put this small binary in apache's cgi dir,
> created a small post input form, posted to it, it echo'd exactly the same
> thing it did when run through my server through apache (eg: the raw
> unformatted post input).
> 
> So, am I missing something? Do I need to set another enviorment variable
> to get the php-cgi module to read post data from stdin as per cgi/1.1? (as
> far as I can tell....)
> 
> 
> 
> Enviorment variables set:
> 
> putenv(SCRIPT_NAME=/testphp.php)
> putenv(REQUEST_METHOD=POST)
> putenv(CONTENT_LENGTH=0)
> putenv(CONTENT_TYPE=application/x-www-form-urlencoded)
> putenv(POST_DATA=p_email=asdf&p_test=woork)
> putenv(SCRIPT_NAME=/testphp.php)
> putenv(SERVER_NAME=localhost:5555)
> putenv(SERVER_PORT=5555)
> putenv(REMOTE_ADDR=127.0.0.1)
> putenv(DOCUMENT_ROOT=/home/user/ant/httpd/)
> putenv(SCRIPT_NAME=/testphp.php)
> putenv(PHP_SELF=/testphp.php)
> putenv(SCRIPT_FILENAME=/home/user/ant/httpd/testphp.php)
> putenv(DOCUMENT_NAME=testphp.php)
> putenv(SERVER_PROTOCOL=HTTP/1.1)
> putenv(SERVER_SOFTWARE=ANT-1.0)
> putenv(GATEWAY_INTERFACE=CGI/1.1)
> putenv(HTTP_USER_AGENT=User-Agent: Mozilla/5.0 (X11; U; Linux x86_64;
> en-US; rv:1.7.8) Gecko/20050524 Fedora/1.0.4-4 Firefox/1.0.4 )
>
putenv(HTTP_ACCEPT=text/xml,application/xml,application/xhtml+xml,text/html;q
> 0.9,text/plain;q=0.8,image/png,*/*;q=0.5)
> putenv(HTTP_ACCEPT_LANGUAGE=en-us,en;q 0.5)
> putenv(HTTP_ACCEPT_CHARSET=ISO-8859-1,utf-8;q 0.7,*;q=0.7)
> putenv(REDIRECT_STATUS=200)
> putenv(HTTP_ACCEPT_ENCODING=gzip,deflate)
> 
> Method(s) tried for sending post data to php-cgi: (At the same time, and
> seperately)
> 1) write(childstdin, poststring.c_str(), poststring.size());
> 
> 2) command.append("php-cgi < echo \");
> command.append(poststring);
> command.append("\"");
> pipe_command(command); // export variables, run custom popen, before
> execl(bin/sh -c command null) redir stdin and stdout, create third notify
> pipe, notify parent when enviorment variables are registered in child,
> child waits until any 1 charactor is written to notify pipe, parent
> write's to child's stdin, notify's child when write is finish, child runs
> execl on command, parent waits for child to finish, after child exits()
> parent reads stdout of child and let's the webserver take it on it's merry
> little way to the client adding all the server specific header fields and
> all that.
> 
> 
> It works with my own custom "cgi" module above, but not php-cgi, for posts
> only. It works on get's with both.
> 
> Thanks in advance, this is driving me nuts! :)
> 
> Oh, btw, I have both:
> php-cgi --version
> PHP 5.0.4 (cgi-fcgi) (built: May  9 2005 11:20:57)
> Copyright (c) 1997-2004 The PHP Group
> Zend Engine v2.0.4-dev, Copyright (c) 1998-2004 Zend Technologies // came
> with fedora
> 
> php-cgi2 --version
> PHP 5.1.2 (cgi) (built: Jan 31 2006 00:42:07)
> Copyright (c) 1997-2006 The PHP Group
> Zend Engine v2.1.0, Copyright (c) 1998-2006 Zend Technologies // I just
> installed and tried to see if it would make a difference.
> 
> to work with, and can get and install any other version if needed.
> 
> 
> Thanks again!

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to