快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-22

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

访问者通过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的代理程序。

聞喘圭隈?

process.exe  max_time_limit  client_exe_name  [  param1_to_client,  param2_to_client,...  ...]

max_time_limite頁參坐昼葎汽了。

匯違秤趨和?厘断聞喘proc_open()頁宸劔議

$cmd="test.exe  24  154";

宥狛process.exe寂俊距喘延撹?

process.exe  1000  test.exe  24  154

輝距喘議人薩殻會階扮?process祥氏姫棒序殻旺卦指。

參和頁process議坿殻會?Dev-C++和園咎宥狛。

//filename:process.cpp
 #include  <iostream>
 #include  <stdlib.h>
 #include  <windows.h>
 #include  <conio.h>
 #include  <string.h>
 using  namespace  std;

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号