Wenn Sie einen PHP-Crawler verwenden, müssen Sie die CLI-Umgebung verwenden
Ich habe die aktuellen PHP-Versionsinformationen wie folgt überprüft:
Ich drucke PHP_SAPI
zeige fpm-fcgi
Wie man cli
Die Serverumgebung ist Linux Nginx
Zusätzlich: Kann ich verstehen, dass CLI den Befehlszeilenmodus erfordern muss?
Ich habe es gerade auf der Befehlszeile getestetPHP_SAPI
und es wird ausgegeben cli
F: Kann HTTP-Aufrufe simulieren, um CLI zu implementieren
Wenn Sie einen PHP-Crawler verwenden, müssen Sie die CLI-Umgebung verwenden
Ich habe die aktuellen PHP-Versionsinformationen wie folgt überprüft:
Ich drucke PHP_SAPI
zeige fpm-fcgi
Wie man cli
Die Serverumgebung ist Linux Nginx
Zusätzlich: Kann ich verstehen, dass CLI den Befehlszeilenmodus erfordern muss?
Ich habe es gerade auf der Befehlszeile getestetPHP_SAPI
und es wird ausgegeben cli
F: Kann HTTP-Aufrufe simulieren, um CLI zu implementieren
CLI = Befehlszeilenschnittstelle = Befehlszeilenschnittstelle
Sie können popen oder proc_open in php-fpm verwenden, um php-cli asynchron aufzurufen, um ein PHP-Skript auszuführen, wie zum Beispiel:
<code>例子1(popen): <?php function foo() { echo date('Y-m-d H:i:s')."\n"; echo shell_exec('php -r \'sleep(1); echo date("Y-m-d H:i:s")." by shell_exec:blocking\n";\''); //阻塞 $pipe1 = popen('php -r \'sleep(2); echo date("Y-m-d H:i:s")." by popen1:non-blocking\n";\'', 'r'); //非阻塞(管道) $pipe2 = popen('php -r \'sleep(1); echo date("Y-m-d H:i:s")." by popen2:non-blocking\n";\'', 'r'); //非阻塞(管道) echo date('Y-m-d H:i:s')."\n"; register_shutdown_function(function() use ($pipe1, $pipe2) { //事件驱动(脚本结束事件),异步回调 echo stream_get_contents($pipe1); //输出子进程返回的数据 echo stream_get_contents($pipe2); //输出子进程返回的数据 pclose($pipe1); pclose($pipe2); }); } foo(); //输出 2016-09-11 20:25:30 2016-09-11 20:25:31 by shell_exec:blocking 2016-09-11 20:25:31 2016-09-11 20:25:33 by popen1:non-blocking 2016-09-11 20:25:32 by popen2:non-blocking 例子2(proc_open): PHP用proc_open新建子进程使用管道通信非阻塞执行PHP脚本. 脚本结束时register_shutdown_function回调函数访问管道获取子进程输出的数据. <?php function foo() { $proc = proc_open( //task.php 内容为 $arr = unserialize(stream_get_contents(STDIN)); $arr['time'] = date('Y-m-d H:i:s', $arr['time']); echo serialize($arr); '/png/php/5.4.45/bin/php /home/eechen/task.php', array( 0 => array('pipe','r'), //stdin (用fwrite写入数据给管道) 1 => array('pipe','w'), //stdout(用stream_get_contents获取管道输出) 2 => array('pipe','w'), //stderr(用stream_get_contents获取管道输出) //2 => array('file','/tmp/err.txt','a') //stderr(写入到文件) ), $pipes, //管道(stdin/stdout/stderr) '/tmp', //当前PHP进程的工作目录 array('foo' => 'bar') //php.ini 配置 variables_order = "EGPCS" 其中E表示$_ENV,否则$_ENV输出为空 ); //var_dump($pipes); //resource of type (stream) if(is_resource($proc)) { //stdin $stdin = serialize(array('time' => time())); fwrite($pipes[0], $stdin); //把参数传给脚本task.php fclose($pipes[0]); //fclose关闭管道后proc_close才能退出子进程,否则会发生死锁 register_shutdown_function(function() use($pipes, $proc) { //事件驱动(脚本结束事件),异步回调 //stdout $stdout = stream_get_contents($pipes[1]); fclose($pipes[1]); //stderr $stderr = stream_get_contents($pipes[2]); fclose($pipes[2]); //exit code (返回进程的终止状态码,如果发生错则返回-1) $status = proc_close($proc); $data = array( 'stdout' => $stdout, 'stderr' => $stderr, 'status' => $status, ); var_export($data); //echo json_encode($data); }); } } foo(); //输出: array ( 'stdout' => 'a:1:{s:4:"time";s:19:"2016-09-11 21:26:29";}', 'stderr' => '', 'status' => 0, )</code>
cli ist die Befehlszeile und unter Linux der php
-Befehl. Es gibt viele Möglichkeiten, die Befehlszeile in PHP auszuführen. Sie können Funktionen wie exec
verwenden, um sie asynchron auszuführen. Bitte lesen Sie die Dokumentation im Detail
Führen Sie das Skript einfach direkt vom Terminal aus