Javascript 如何在不使用PHP exec或shell_exec的情况下运行CasperJS脚本

Javascript 如何在不使用PHP exec或shell_exec的情况下运行CasperJS脚本,javascript,php,shell,casperjs,Javascript,Php,Shell,Casperjs,我有一个CasperJS脚本,其中的结果需要用PHP捕获。为此,我不得不使用PHP的exec()或shell\u exec()函数。但最近我了解到,在服务器上启用命令行执行是有风险的,而且不安全。那么,在不使用PHP中的任何一个函数的情况下,我应该如何运行CasperJS脚本呢 PS: 更准确地说,如何在web浏览器上使用CasperJS,比如使用PHP处理web表单,并返回从CasperJS派生的输出,而不必触摸exec或shell_exec来执行它。您可以做通常的小方块舞 运行PHP,捕获输

我有一个CasperJS脚本,其中的结果需要用PHP捕获。为此,我不得不使用PHP的
exec()
shell\u exec()
函数。但最近我了解到,在服务器上启用命令行执行是有风险的,而且不安全。那么,在不使用PHP中的任何一个函数的情况下,我应该如何运行CasperJS脚本呢

PS
更准确地说,如何在web浏览器上使用CasperJS,比如使用PHP处理web表单,并返回从CasperJS派生的输出,而不必触摸exec或shell_exec来执行它。

您可以做通常的小方块舞

  • 运行PHP,捕获输入,生成作业配置
  • 把那份工作放到数据库里,用CRON把它弄出来
  • 用任何方法处理它,将结果放在不同的DB表或文件系统中
  • 将作业标记为“完成”,这样面向用户的PHP可以定期轮询该状态,并在完成后向用户显示最终结果
  • 如果你这样做是因为你知道攻击向量“<代码>执行”(<代码)>在你的应用程序中公开,并且不能忍受这个——没关系。 但是,如果你这样做是因为你害怕“甚至不知道什么”,那么就不要这样做。你会让事情变得更糟

    祝你好运。

    :)

    CasperJS构建在PhantomJS(或SlimerJS)之上。它可以使用PhantomJS提供的所有功能,包括。想法是运行一个CasperJS实例,PHP脚本可以通过HTTP查询该实例

    您可以在系统启动时或通过cron作业启动CasperJS脚本(并在崩溃时重新启动)。然后可以通过本地http请求查询它

    CasperJS脚本:

    var webserver = require('webserver');
    var server = webserver.create();
    var service = server.listen(8080, function(request, response) {
        var casper = require('casper').create({
            exitOnError: false,
            onError: function(msg, backtrace){
                response.statusCode = 500;
                response.write('ERROR: ' + msg + "\n" + JSON.stringify(backtrace));
                response.close();
            }
        });
    
        casper.start(yourURL, function(){
            // TODO: do something
            response.statusCode = 200;
            response.write('something');
            response.close();
        }).run(function(){
            // this function is necessary to prevent exiting the whole script
        });
    });
    
    在PHP中,您可以使用类似的方法检索响应:

    $result = file_get_contents("http://localhost:8080/");
    
    注意事项:

    • 以这样一种方式配置您的机器:运行PhantomJS的端口无法从外部访问
    • 如果您使用的是cron作业方法,请编写一个pid文件以确保不启动另一个实例
    • web服务器模块仅支持10个并发请求。如果您的系统超过了这些,您将需要创建一个包含多个CasperJS(PhantomJS)进程的池
    • 单个CasperJS(PhantomJS)进程的页面都共享同一个会话,就像在任何普通浏览器中一样。如果您想将它们彼此隔离,那么您需要为每个请求运行CasperJS(PhantomJS)进程

    我正在考虑一种在web浏览器上使用casper js的方法,而不仅仅是通过cron执行。处理web表单并返回从casper js派生的输出。我想我还没有说清楚。CasperJS将在后台连续运行,并从PHP脚本接收连接。cron部分只有在CasperJS崩溃的情况下才会出现,因此可以重新启动它。