Heim  >  Artikel  >  Backend-Entwicklung  >  So wechseln Sie den PHP-Laufmodus von fpm-fcgi auf cli

So wechseln Sie den PHP-Laufmodus von fpm-fcgi auf cli

WBOY
WBOYOriginal
2016-10-10 11:56:042398Durchsuche

Wenn Sie einen PHP-Crawler verwenden, müssen Sie die CLI-Umgebung verwenden
Ich habe die aktuellen PHP-Versionsinformationen wie folgt überprüft:

So wechseln Sie den PHP-Laufmodus von fpm-fcgi auf cli

Ich drucke PHP_SAPIzeige fpm-fcgi

Wie man cli

wird

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

Antwortinhalt:

Wenn Sie einen PHP-Crawler verwenden, müssen Sie die CLI-Umgebung verwenden
Ich habe die aktuellen PHP-Versionsinformationen wie folgt überprüft:

So wechseln Sie den PHP-Laufmodus von fpm-fcgi auf cli

Ich drucke PHP_SAPIzeige fpm-fcgi

Wie man cli

wird

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

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn