簡體   English   中英

如何在不使用PHP exec或shell_exec的情況下運行CasperJS腳本

[英]How to run CasperJS script without using PHP exec or shell_exec

我有一個CasperJS腳本,其中的結果需要用PHP捕獲。 為此,我不得不使用PHP的exec()shell_exec()函數。 但是最近我才知道在服務器上啟用命令行執行是有風險的,而且並不安全。 那么,如何在不使用PHP中的任何一個函數的情況下運行CasperJS腳本呢?

PS :更准確地說,如何在Web瀏覽器上使用CasperJS,例如使用PHP處理Web表單並返回從CasperJS派生的輸出,而無需觸摸exec或shell_exec來執行它。

CasperJS基於PhantomJS(或SlimerJS)構建。 它可以使用PhantomJS提供的所有功能,包括Web服務器模塊 這個想法是運行一個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. 運行您的PHP程序,捕獲輸入,生成作業配置。
  2. 將該工作放在您的數據庫中,然后使用CRON進行處理。
  3. 使用任何方法進行處理 ,將結果放入不同的數據庫表或文件系統中。
  4. 將您的工作標記為“完成”,以便面向用戶的PHP可以定期輪詢該狀態,並在完成時向用戶提供最終結果。

如果您這樣做是因為您知道exec()在您的應用程序中暴露了什么攻擊向量,並且不能忍受該攻擊向量-沒關系。

但是,如果您因為害怕“甚至不確定”而這樣做,那就不要。 您會變得更糟。

祝好運。
:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM