Linux

參數將 php exec() 限制為 bash 腳本

  • December 2, 2020

測試將 50000 個參數從 php 傳遞到 bash 腳本需要多長時間,結果我不能一次將 1000 個參數從 php 傳遞到 bash 腳本,除非我可以?

PHP:
   
$array = fetch_results_from_working_pool_temp_table ();
$outputfile = "/var/www/html/outputFile";
$pidfile = "/var/www/html/pidFile";
$id = "";
$array_check=array();

foreach ( $array as $row => $column ) {
   $id .= $column ['id'];
       $id .= " "; 
       
}
$cmd = "sudo /bin/bash /var/www/html/statistics/pass_all.sh {$id}";
exec( sprintf ( "%s >> %s 2>&1 & echo $! >> %s", $cmd, $outputfile, $pidfile ) );


bash:

#!/bin/bash
for ip in "$@"
do 
   echo "${ip}" 
done

所以我的php將參數傳遞給bash , bash連同任何錯誤一起列印到outputFile 。****pidfile將保存使用此 exec 啟動的程序的 pid。 **該命令甚至沒有被執行,因為我沒有看到任何程序啟動。**exec 中傳遞的參數有限制嗎?或來自 PHP 或在 Linux shell 中? 我正在執行 php 5.4 和 Linux Redhat 7 我想使用 GNU 並行執行程序,但因為 PHP 是單執行緒的(有庫可以通過它,但我寧願避免這種情況)。也許我可以以某種方式將它傳遞給文本文件並執行到從該文本文件中提取的腳本?幫助!

**更新:我的機器限制:**
#getconf ARG_MAX
2097152

#ulimit -a
核心文件大小(塊,-c)0
數據段大小 (kbytes, -d) 無限制
調度優先級 (-e) 0
文件大小(塊,-f)無限制
待處理信號 (-i) 256634
最大鎖定記憶體 (kbytes, -l) 64
最大記憶體大小 (kbytes, -m) 無限制
打開文件 (-n) 1024
管道大小(512 字節,-p)8
POSIX 消息隊列(字節,-q)819200
實時優先級 (-r) 0
堆棧大小(千字節,-s)8192
cpu時間(秒,-t)無限制
最大使用者程序 (-u) 4096
虛擬記憶體 (kbytes, -v) 無限制
文件鎖 (-x) 無限制

在大多數係統上,核心限制execve()系統呼叫的參數大小(命令行參數 + 環境變數)。在 Linux 上,該限制與最大堆棧大小有關,但通常對於 8 MB 的預設堆棧大小限制,您總共會獲得至少 2 MB。它還將單個參數限制為 128 kB,請參見例如bash 文件名擴展(萬用字元)是否有最大值,如果有,它是什麼?提高 Linux 環境變數的 128KiB 限制

如果 PHPsh -c 'command line'在您呼叫時執行,exec("command line")那麼參數 to-c很可能會超過 128 kB 的限制。命令行隨後被 shell 拆分為不同的單詞這一事實無濟於事。

引用自:https://unix.stackexchange.com/questions/622412