Hi,
I've been looking at the PHP streams source code. I wondered if you could
help with this problem i've got with a PHP extension. Any help with this
would be very much appreciated!
What I want to do is create a php extension which parses php code to the
interpreter. e.g. the php script using the php extension will something
like this:
<?php
passCode("echo('Hello World');");
?>
The extension will look something like this:
PHP_FUNCTION
{
char code[128] = "echo('Hello World');";
size_t bt;
php_stream * phpStream = php_stream_open_wrapper("php://stdout", "w",
REPORT_ERRORS, NULL);
if (stream)
{
zend_printf("Stream Connected");
bt = php_stream_write(phpStream, code, sizeof(code));
php_stream_close(phpStream);
}
else
{
zend_printf("Stream Connection Error");
}
}
This function would pass the code "echo('Hello World');" to PHP and execute
it. What I am having problems is, is retrieving the output of this function
e.g. "Hello World". But the problem with PHP is that it's unidirectional
(oneway) from what I know.
Is there a way to read the output from PHP? What would be the best way of
doing that? Would it have anything to do with flushing?
Thank you very much for your time. Any help with this would be most
appreciated. I wanted to ask you, as you are a developer for PHP, and you
developed the php streaming for php extensions and c++ programs.
I hope it makes sense.
Many Regards,
Ben Chivers
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.686 / Virus Database: 447 - Release Date: 14/05/2004
Two things:
(1) If all you're doing is outputting, go for php_printf() rather than the
php://stdout or php://output stream. It avoids the need to open additional
streams and makes sure that your extension won't have problems compiling
against pre-4.3 versions of PHP.
(2) You've got code defined as char[128], and use sizeof()
in your
php_stream_write() call which means that you'll wind up outputting the
entire 128 bytes of the char array, plus you don't want the trailing NULL
anyway, so go with strlen()
rather than sizeof()
here.
That said, the most universal way of retrieving data otherwise output by PHP
is through output buffering. Recall that in userspace you can do
ob_start()
; /* do stuff / $contents = ob_get_contents()
; ob_end_clean()
; To
get the output of the / do stuff */ block into $contents.
In C-land you can take the equivalent approach, or temporarily override the
output handler, but I recommend the ob approach as it's a bit easier. Take
a look in main/ouput.c for the internal implemetation of the ob_*()
functions.
-Sara
----- Original Message -----
From: "Ben Chivers" ben.chivers53@ntlworld.com
Newsgroups: php.internals
To: internals@lists.php.net
Sent: Monday, May 17, 2004 7:07 AM
Subject: Re: Streams - Extensions
Hi,
I've been looking at the PHP streams source code. I wondered if you
could
help with this problem i've got with a PHP extension. Any help with this
would be very much appreciated!What I want to do is create a php extension which parses php code to the
interpreter. e.g. the php script using the php extension will something
like this:<?php
passCode("echo('Hello World');");
?>
The extension will look something like this:
PHP_FUNCTION
{
char code[128] = "echo('Hello World');";
size_t bt;php_stream * phpStream = php_stream_open_wrapper("php://stdout", "w",
REPORT_ERRORS, NULL);
if (stream)
{
zend_printf("Stream Connected");
bt = php_stream_write(phpStream, code, sizeof(code));
php_stream_close(phpStream);
}
else
{
zend_printf("Stream Connection Error");
}
}This function would pass the code "echo('Hello World');" to PHP and
execute
it. What I am having problems is, is retrieving the output of this
function
e.g. "Hello World". But the problem with PHP is that it's unidirectional
(oneway) from what I know.Is there a way to read the output from PHP? What would be the best way
of
doing that? Would it have anything to do with flushing?Thank you very much for your time. Any help with this would be most
appreciated. I wanted to ask you, as you are a developer for PHP, and you
developed the php streaming for php extensions and c++ programs.I hope it makes sense.
Many Regards,
Ben Chivers
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.686 / Virus Database: 447 - Release Date: 14/05/2004