import process.popen; import process.job.limitKill; namespace process.php; class cgi{ ctor(response,request,cgiPath,iniPath,...){ if(!iniPath){ iniPath = ..io.joinpath(..io.splitpath(cgiPath).dir,"php.ini"); } var env = request.environ; env.REDIRECT_STATUS = 200; env.PHP_SELF = env.PATH_INFO; if( ..string.endsWith(env.PATH_INFO,".php",true) ){ env.SCRIPT_NAME = env.PATH_INFO; env.SCRIPT_FILENAME = env.PATH_TRANSLATED; } env.PATH_INFO = null; var prcs,err = ..process.popen(cgiPath, {"-c";..io.fullpath(iniPath);...}, {environment = env }); if(!prcs){ response.error(err); return; } prcs.killOnExit(); prcs.codepage = 65001; if(request.contentLength){ prcs.write( request.postData() ) } prcs.writeClose(); var strHeaders = ""; var httpHeaders; while( var char = prcs.stdOut.read(1) ) { strHeaders = strHeaders ++ char; if(..string.endsWith(strHeaders,'\r\n\r\n')){ strHeaders = ..string.left(strHeaders,-5); httpHeaders = ..string.splitEx(strHeaders,"\r\n"); break; } } if(httpHeaders) { response.charset = ""; var lastHeaderKey; for(i=#httpHeaders;1;-1){ var line = httpHeaders[i]; if(line[1]==' ' || line[1]=='\t'){ if(lastHeaderKey){ httpHeaders[ lastHeaderKey ] = httpHeaders[ lastHeaderKey ] ++ ..string.trimleft(line); } continue; }; var h = ..string.splitEx(line,"\:\s*",2); if(#h == 2){ var k = ..string.lower(h[1]); var v = h[2]; if(k=="content-type"){ response.contentType = v; } elseif(k=="status"){ response.status = v; } else { response.headers[h[1]] = v; } } } for( all,out,err in prcs.each() ){ if(#out){ response.write(out); } else { if(!..string.isUtf8(err)){ err = ..string.fromto(err,0,65001); } ..io.stderr.write(err); response.error(err); } } } else{ var err = prcs.readErr(-1); if(#err){ if(!..string.isUtf8(err)){ err = ..string.fromto(err,0,65001); } ..io.stderr.write(err); response.error(err); } } prcs.close(); } } /**intellisense() process.php.cgi = 用于HTTP服务器创建PHP CGI进程\n适用于 wsock.tcp.simpleHttpServer 或 wsock.tcp.asynHttpServer process.php.cgi(.(response,request,cgiPath,iniPath,->->->) = @response,@request参数为HTTP服务器的请求与响应对象,\n@cgiPath指定php-cgi.exe的路径,\n@iniPath为可选参数,用于指定php.ini的路径,\n可选添加任意个php-cgi.exe的启动参数 end intellisense**/