This is a discussion on popen on Windows within the PHP Language forums, part of the PHP Programming Forums category; On Dec 23, 11:42 am, Daniel Klein <dani...@featherbrain.net> wrote: > On Sun, 23 Dec 2007 ...
|
|||||||
| FAQ | Members List | Calendar | Search | Today's Posts | Mark Forums Read |
|
|||
|
On Dec 23, 11:42 am, Daniel Klein <dani...@featherbrain.net> wrote:
> On Sun, 23 Dec 2007 14:50:59 GMT, Daniel Klein > > > > <dani...@featherbrain.net> wrote: > >On Mon, 24 Dec 2007 00:44:14 +1000, "Vince Morgan" > ><vinharAtHereoptusnet.com.au> wrote: > > >>"Daniel Klein" <dani...@featherbrain.net> wrote in message > >>news:u89qm352ob3hep0heags7bd82q3seqcdjb@4ax.com. .. > >>> I'm trying to get popen to work on Windows. > > >>> Here's a simplified example of what I'm trying to get working: > > >>> I have a hw.c program as follows: > > >>> #include <stdio.h> > >>> main() > >>> { > >>> printf ("Hello World!\n"); > >>> } > > Just to be thorough, I created a php script: > > <?php > echo "Hi"; > ?> > > and replaced the 'hw.exe' with 'php hi.php' - I got the same problem > as originally reported. There are usually two issues with this type of code: (1) Is anything getting executed at all? (2) Collecting the output. To verify that (1) is working, you could use a file_put_contents(...) together with date(...) Also, popen has undergone changes in the last year so if you are working with an older version of php (perhaps 5.1 or earlier?) things may be slightly different. Here is an example of collecting output from popen that works in a web server context for me: <?php function getPOpenOutput ($cmd) { $out = ""; $proc = popen ($cmd, "r"); while (!feof($proc)) { // wait for output to finish $slurp = fgets($proc, 256); if (strlen($slurp)>0) $out .= $slurp; else com_message_pump(200); } pclose ($proc); return $out; } $cmnd = "SchTasks"; $out = getPOpenOutput ($cmnd); print "<pre>$out</pre>"; ?> You may have to set the web server to "Allow service to interact with the Desktop", which is found under Control Panel \ Services Finally, if you are calling on more complicated programs, you may need to escape characters like double quotes, <, >, ^, et. al) within $cmnd, which can be non trivial. For example: $cmnd = "php -r echo('hi');"; but $cmnd = "php -r \"echo('hi there');\""; Csaba Gabor from Vancouver |
|
|||
|
On Tue, 25 Dec 2007 12:22:33 -0800 (PST), Csaba Gabor
<danswer@gmail.com> wrote: >On Dec 23, 11:42 am, Daniel Klein <dani...@featherbrain.net> wrote: >> On Sun, 23 Dec 2007 14:50:59 GMT, Daniel Klein >> >> >> >> <dani...@featherbrain.net> wrote: >> >On Mon, 24 Dec 2007 00:44:14 +1000, "Vince Morgan" >> ><vinharAtHereoptusnet.com.au> wrote: >> >> >>"Daniel Klein" <dani...@featherbrain.net> wrote in message >> >>news:u89qm352ob3hep0heags7bd82q3seqcdjb@4ax.com. .. >> >>> I'm trying to get popen to work on Windows. >> >> >>> Here's a simplified example of what I'm trying to get working: >> >> >>> I have a hw.c program as follows: >> >> >>> #include <stdio.h> >> >>> main() >> >>> { >> >>> printf ("Hello World!\n"); >> >>> } >> >> Just to be thorough, I created a php script: >> >> <?php >> echo "Hi"; >> ?> >> >> and replaced the 'hw.exe' with 'php hi.php' - I got the same problem >> as originally reported. > >There are usually two issues with this type of code: (1) Is anything >getting executed at all? (2) Collecting the output. To verify that >(1) is working, you could use a file_put_contents(...) together with >date(...) I turned on error reporting and it appears that the popen is not getting executed at all. I replaced the executable with one that writes out a small file and it did not even get called. To be sure, I ran the php code from CLI and sure enuf it ran fine. >Also, popen has undergone changes in the last year so if you are >working with an older version of php (perhaps 5.1 or earlier?) things >may be slightly different. I'm running PHP 5.2.5. >Here is an example of collecting output from popen that works in a web >server context for me: > ><?php >function getPOpenOutput ($cmd) { > $out = ""; > $proc = popen ($cmd, "r"); > while (!feof($proc)) { // wait for output to finish > $slurp = fgets($proc, 256); > if (strlen($slurp)>0) $out .= $slurp; > else com_message_pump(200); } > pclose ($proc); > return $out; } > >$cmnd = "SchTasks"; >$out = getPOpenOutput ($cmnd); >print "<pre>$out</pre>"; >?> Thanks for this code. >You may have to set the web server to >"Allow service to interact with the Desktop", >which is found under Control Panel \ Services Yes, I had already done this (should have mentioned it in my post so as to not have to cover 'old' ground, sorry). >Finally, if you are calling on more complicated >programs, you may need to escape characters >like double quotes, <, >, ^, et. al) within >$cmnd, which can be non trivial. For example: >$cmnd = "php -r echo('hi');"; >but >$cmnd = "php -r \"echo('hi there');\""; Good point! *** Btw, I have since installed Apache 2.2 and this has resolved the issue (nice way to spend the holiday, don't you think ;-). Again, I had to make sure that the service was able to interact with the desktop and that the process has the appropriate executable permissions. In conclusion, the ability to use 'popen' or 'proc_open' or 'back tics' on Windows appears to be a Windows/IIS limitation / security-feature(?) / bug(?) / whatever... Hope this conversation will be of use to others attempting the 'impossible' on Windows. Daniel Klein Cuyahoga Falls, OH |
|
|||
|
Vince Morgan wrote:
> "Daniel Klein" <danielk@featherbrain.net> wrote in message > news:u89qm352ob3hep0heags7bd82q3seqcdjb@4ax.com... >> I'm trying to get popen to work on Windows. >> >> Here's a simplified example of what I'm trying to get working: >> >> I have a hw.c program as follows: >> >> #include <stdio.h> >> main() >> { >> printf ("Hello World!\n"); >> } >> >> And here's the 'popentest.php' code: >> >> popen test... >> <?php >> $fp = popen('C:\\home\\bin\\hw.exe', 'r'); >> $data = fread($fp, 1024); > > According to the manual the file pointer that is returned by "popen()" can > be used by the following, fgets(), fgetss(), and fwrite() whereas you are > calling "fread()". > Not a problem. fread() can use the handle returned by popen() also. See further down where there is an example of that. >> It works when I run this from a command prompt: >> >> C:\Inetpub\wwwroot\php>php popentest.php >> popen test... >> Hello World! > That is because hw.exe is outputting to the consol when it runs I would > think > http://www.php.net/popen > HTH, > Vince > > > Not knowing what hw.exe is doing, it's hard to say. -- ================== Remove the "x" from my email address Jerry Stuckle JDS Computer Training Corp. jstucklex@attglobal.net ================== |
|
|||
|
Vince Morgan wrote:
> "Tim Roberts" <timr@probo.com> wrote in message > news:ag71n3hb9lsf385c5pdf0k4os0s9pcjvfn@4ax.com... >> You are wrong. "printf" writes to stdout. If you run it from a console, >> then stdout is connected to the console, but that's certainly not the only >> option. If you type: >> hw > xxx.txt >> then clearly "printf" is not going to the console. > > Clearly, thank you. > >> Your suggestion about fread is also off the mark. Any of the stdio >> functions will work. > >>>> "Vince Morgan" <vinharAtHereoptusnet.com.au> wrote: > [snip] >>>> According to the manual the file pointer that is returned by "popen()" > can >>>> be used by the following, fgets(), fgetss(), and fwrite() whereas you are >>>> calling "fread()". > [snip] > > What suggestion was that? I can't see it in the above. You have another > source? > >>> You need to capture the output as a string so >>> that it can be output to the server as HTML or whatever. However you > cannot >>> return a string from a C executable. > Ooops, pipes. >> Not so. Perhaps you should hold off on replying until you are in more >> familiar territory. > > My appologies to Daniel. > > I see your ego is much larger than you manners.. > Regards, > Vince Morgan > > > Sorry, Vince. I agree with Tim. You're grasping at straws here. -- ================== Remove the "x" from my email address Jerry Stuckle JDS Computer Training Corp. jstucklex@attglobal.net ================== |
|
|||
|
Daniel Klein wrote:
> I'm trying to get popen to work on Windows. > > Here's a simplified example of what I'm trying to get working: > > I have a hw.c program as follows: > > #include <stdio.h> > main() > { > printf ("Hello World!\n"); > } > > And here's the 'popentest.php' code: > > popen test... > <?php > $fp = popen('C:\\home\\bin\\hw.exe', 'r'); > $data = fread($fp, 1024); > pclose($fp); > echo $data; > ?> > > It works when I run this from a command prompt: > > C:\Inetpub\wwwroot\php>php popentest.php > popen test... > Hello World! > > All I get in a web browser is: > > popen test... > > What am I missing? > > Thanks > Daniel Klein > Daniel, On question - does the web server user have permission to execute the file? Have you verified this? -- ================== Remove the "x" from my email address Jerry Stuckle JDS Computer Training Corp. jstucklex@attglobal.net ================== |
|
|||
|
"Jerry Stuckle" <jstucklex@attglobal.net> wrote in message
news:i8SdnXF43P9d_-nanZ2dnUVZ_uDinZ2d@comcast.com... > >>>> "Vince Morgan" <vinharAtHereoptusnet.com.au> wrote: > > [snip] > >>>> According to the manual the file pointer that is returned by "popen()" > > can > >>>> be used by the following, fgets(), fgetss(), and fwrite() whereas you are > >>>> calling "fread()". > > [snip] > > Sorry, Vince. I agree with Tim. You're grasping at straws here. I "almost" agree with that assesment Jerry. However, what I wrote above is what is in the current manual. However, if I had read further I would have discovered it was deficient. Quote:
respect. If quoting from the manual is a "suggestion" as opposed to an observation I agree totaly. That they are all I/O functions should have been obvious to me also, but I missed that too @@ Having said that I agree Tim was right that I should have stayed out of it. And I apologise for my testy reply. Highest regards, Vince |
![]() |
| Thread Tools | |
| Display Modes | |
|
|