用AJAX请求从客户机终止用c++编写的长时间运行的CGI脚本

Aborting a long-running CGI script written in C++ from client with AJAX request

本文关键字:长时间 运行 脚本 CGI c++ 请求 AJAX 客户机 终止      更新时间:2023-09-26

我有一个用c++编写的CGI脚本,它在调度类型问题的蛮力计算中执行一个相对简单的循环。参数从数据库中收集,CGI脚本在web浏览器中使用JavaScript使用XMLHttpRequest在POST请求中传递参数来调用。这很好。但是有时它需要太长时间,我希望用户能够通过在脚本运行时单击浏览器中的按钮来中止脚本。

我已经从CGI脚本内部轮询了一个小文件。该文件可以包含'0'或'1',表示脚本应该中止。这也有用。然而,相对而言,文件I/O本身需要花费很多时间,我想知道是否有更优雅的方法来做到这一点?我只能每四五百万次迭代检查一次,否则就会遇到问题。我可以忍受,但我想知道我是否可以用环境变量来做到这一点,例如?

谢谢你的建议!

CGI是不灵活的,所以任何解决方案都应该依赖于其他方法。

复制策略:

  1. 将该文件放到ram磁盘上-文件IO应该下降

  2. 用TCP信令代替FS信令。让执行器脚本打开一个套接字,用于监听专用端口的"中止守护进程"。如果执行器脚本"socket"从"abort守护进程"中窥探到一个字节可用,它就会终止。一旦启动,执行脚本将只需要将打开的端口通信到"中止页面"。另一个由"Abort"按钮指向url的脚本需要与"Abort守护进程"通信,该端口发送"杀手字节"。


关于服务器运行PHP的额外信息,您可以尝试使用PHP缓存作为消息传递机制-参见APC store和相关内容。

其他缓存似乎存在-这里列出了其他缓存。


也许是矫枉过正- redis -他们说

Redis是一个开源(BSD许可)的内存数据结构存储,用作数据库,缓存和消息代理。

拥有大量支持的语言,包括C和PHP。值得注意的是在维基百科上有一个条目

经过一些初步测试,似乎PHP shmop提供的共享内存设施将是我在当前可用的服务器环境中使用的最简单和最安全的。非常感谢Adrian Colomitchi,他为我指出了正确的方向(RAM磁盘==共享内存)!