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

时间:2015-08-06 07:26:37

标签: javascript php shell casperjs

我有一个CasperJS脚本,其结果需要在PHP中捕获。为此,我必须使用PHP的exec()shell_exec()函数。但最近我知道在服务器上启用命令行执行存在风险且不安全。那么如何在不使用PHP中的任何一个函数的情况下运行我的CasperJS脚本呢?

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

2 个答案:

答案 0 :(得分:1)

CasperJS建立在PhantomJS(或SlimerJS)之上。它可以使用PhantomJS提供的所有功能,包括Web Server Module。我们的想法是运行一个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中,您可以使用类似file_get_contents()的内容来检索响应:

$result = file_get_contents("http://localhost:8080/");

需要注意的事项:

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

答案 1 :(得分:0)

你做平常的小广场舞。

  1. 运行PHP事物,捕获输入,生成作业配置。
  2. 作业放入您的数据库,然后通过CRON获取。
  3. 使用任何处理它,将结果放在不同的数据库表或文件系统中。
  4. 作业标记为“已完成”,因此面向用户的PHP可以定期轮询该状态,并在完成后向用户显示最终结果。
  5. 如果你这样做是因为你知道你的应用中有exec()暴露的攻击向量,并且无法忍受 - 那没关系。

    但如果你这样做是因为你害怕“甚至不确定是什么”,那就不要了。你会让事情变得更糟。

    祝你好运。
    :)