windows下解决PHP调用的外部程序超时阻塞问题

我近期做一个东东,大致构架是:

访问者通过web提交c程序,服务端调用编译器编译并且在编译完成后运行编译后的程序,将运行结果传回访问者浏览器。

且不考虑安全性,因为访问者可以都认为是可以信赖的,命令行编译器最终要返回的,但是对于临时编译的程序,尽管用户是可以信赖的,但是不排除因为不完善而出现死锁,php调用后启动的进程无法返回而超时,此进程一直存在直到服务器重启,久而久之,服务器端资源就要耗尽。

考虑到php本身执行的时候没有提供多线程和进程管理功能(可能是我没有看到这方面的资料),使用不管是exec,还是popen等,主程序一旦阻塞就无法自拔,所以必须预留一个线程在必要时管理启动的进程.而我又不想对服务器配置做改动。于是想到自己写一个程序管理启动的进程,php间接通过这个程序调用编译后的客户程序,实现对客户程序超时的控制。

下面是测试用的php程序。

<?
 //filename:  test1.php
 $cmd="test.exe  24  154";//  input  you  command  here

 $cmd="process.exe  5000  ".$cmd;
 $descriptorspec  =  array(
    0  =>  array("pipe",  "r"),   //  stdin  is  a  pipe  that  the  child  will  read  from
    1  =>  array("pipe",  "w"),   //  stdout  is  a  pipe  that  the  child  will  write  to
    2  =>  array("file",  "error-output.txt",  "w+"),  //  stderr  is  a  file  to  write  to
 );
 $process  =  proc_open($cmd,  $descriptorspec,  $pipes);
 if  (is_resource($process))  {
     //  $pipes  now  looks  like  this:
     //  0  =>  writeable  handle  connected  to  child  stdin
     //  1  =>  readable  handle  connected  to  child  stdout
     //  Any  error  output  will  be  appended  to  /tmp/error-output.txt

     fwrite($pipes[0],  '12345678');//  input  integer  to  scanf,  you  should  add  '\n'  at  the  end  of  string  as  'Enter';

 fclose($pipes[0]);

     while(!feof($pipes[1]))  {
         echo  nl2br(fgets($pipes[1],  1024));
     }
     fclose($pipes[1]);
     //  It  is  important  that  you  close  any  pipes  before  calling
     //  proc_close  in  order  to  avoid  a  deadlock
 //proc_terminate($process);
     $return_value  =  proc_close($process);

     echo  "<br>command  returned  $return_value\n";
 }
 ?>

process.exe就是我编写提供给php的代理程序。

时间: 2024-08-02 10:47:22

windows下解决PHP调用的外部程序超时阻塞问题的相关文章

【转】windows下安装和调用curl的方法

本文转自:http://1316478764.iteye.com/blog/2100778 curl是利用URL语法在命令行方式下工作的开源文件传输工具.它支持很多协议:FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 LDAP. 一.windows下curl的安装 1.      到这里http://curl.haxx.se/download/下载文件curl-7.17.1-win32-ssl.zip,如果不需要使用ssl的话,可以直接

Windows下解决php_curl扩展模块无法加载的处理方法

apache 中php_curl不能加载 提示错误Fatal error:Call to undefined function curl_init().我估计应该有人也有类似问题,赶紧百度一下,果然好多人遇到这个问题 1.将PHP安装目录中找libeay32.dll,ssleay32.dll,php_curl.dll,php5ts.dll四个DLL文件,有的在ext目录,找到后将他们复制到system32下,如果找不到请下载对应版本的PHP复制过去; 2.检查php.exe, php5ts.dl

linux下,java调用dll文件时,dll应该放在哪

问题描述 windows下,java调用dll文件时,dll放在system32这个文件夹下面,那linux下,dll文件应该放在哪? 问题补充:radio123 写道 解决方案 楼主要伤心了 linux底下应该不能直接调用dll 二进制格式不一样解决方案二:你们有谁做过把网页生成图片的功能吗,我提问很久了,都没人搭理我,我在windows下行,在linux下就不行了解决方案三:其实我也是啊,一个功能好不容易实现了,但是linux下不能运行,郁闷死了解决方案四:这个还真没有,还是借助网上力量搜索

windows下不打开浏览器访问网页的方法

我们打开电脑,大多时候都是打开浏览器在上网.这都是通过浏览器来实现的,然而windows下有没有办法不通过浏览器也可以像linux那样达到访问网页的目的呢?这当然少不了批处理或者VBScript.然而无论是bat还是vbs都免不了要调用浏览器,关闭浏览器,这都不是我想要的.那么windows下会不会也有curl的用法呢?于是网上查找了一通,发现了这样一篇文章windows下安装和调用curl的方法.这完全就是linux下curl的用法,好了这就是我要的. 于是有了以下这段bat脚本原型 @ech

java修改文件图标-修改windows下的文件图标,怎样写java应用解决

问题描述 修改windows下的文件图标,怎样写java应用解决 我想用java做一个windows的小桌面应用,实现的功能是修改文件图标(图标是我自己从网上下载的jpg格式或者其他格式的图片). 比如:一个XX.txt 文件,我点击一下java应用,就可以实现将XX.txt 的图标修改为我指定的图片.求教各路大神,万分感激- 解决方案 要调用window API 所以你必须要会这个!

runtime-java 在linux 下调用 SH 文件 在windows 下调用 bat 执行后不能 看见进程

问题描述 java 在linux 下调用 SH 文件 在windows 下调用 bat 执行后不能 看见进程 public boolean execCmd(String[] cmds){Process p = null;Runtime rt = Runtime.getRuntime();BufferedReader in = null;InputStreamReader reader = null;try { p = rt.exec(cmds); InputStream info = p.get

Windows下PHP安装路径配置错误导致Apache无法启动怎么解决?

  这篇文章主要介绍了Windows下PHP安装路径配置错误导致Apache无法启动的解决方法,本文可以说是一个引号引发的悲剧,需要的朋友可以参考下 LoadModule php5_module "C(/D):/Program Files/php5/php5apache2_2.dll" PHP安装路径引起的apache无法启动错误 今天给一同事的PC机安装部署web服务的时候,按同事要求把所有程序文件放到安装目录的program files下,于是我把apache安装到了c:progr

Vim在windows下乱码问题的解决

  Vim在windows下乱码问题的解决 Vim默认的编码是GB2312的,没utf-8给我们选,所以得我们自己来配置: 具体配置如下: 打开vim安装目录下的_vimrc,在头部加上几句配置语句就能搞定: 01 //设置默认编码 02 set encoding=utf-8 03 set fileencodings=utf-8,chinese,latin-1 04 if has("win32") 05 set fileencoding=chinese 06 else 07 set f

[已解决]:调用 LoadLibraryEx 失败,在 ISAPI 筛选器 &quot;c:\Windows\Microsoft.NET\Framework\v4.0.30319\\aspnet_filter.

原文:[已解决]:调用 LoadLibraryEx 失败,在 ISAPI 筛选器 "c:\Windows\Microsoft.NET\Framework\v4.0.30319\\aspnet_filter.现象:我的是 win7, iis7, 64bit, 打开网站错误如下: 错误摘要 HTTP 错误 500.0 - Internal Server Error 调用 LoadLibraryEx 失败,在 ISAPI 筛选器 "c:\Windows\Microsoft.NET\Frame