2016-11-22 14 views
2

要するに、私はPHPスクリプトを入手して、UNIXソケットを介してリクエストをリスンし、別のPHPスクリプトからリクエストを送信しようとしています。 私のようなPHP-FPMを設定している:PHPがUNIXソケットに耳を傾ける

[a] 

; Unix user/group of processes 
user = www 
group = www 

listen = /var/run/php-fpm-a.sock 
;listen.backlog = -1 

listen.owner = www 
listen.group = www 
listen.mode = 0660 

; Choose how the process manager will control the number of child processes. 
pm = dynamic 
pm.max_children = 75 
pm.start_servers = 3 
pm.min_spare_servers = 1 
pm.max_spare_servers = 5 
pm.max_requests = 500 

; host-specific php ini settings here 
php_admin_value[open_basedir] = /usr/local/www/a 
php_flag[display_errors] = on 
/usr/local/www/a contains the following index.php: 

<?php 
echo 'test\ntest\ntest\n'; 

効果的/var/run/php-fpm-b.sockで待機し、nginxのは、それを指す別のPHP-FPM設定ファイルは、(このビットが正常に動作します)があり、これは/usr/local/www/b/index.phpに次のコードが含まれています。

echo 'TEST B'; 
$fp = fsockopen('unix:///var/run/php-fpm-a.sock', -1, $errno, $errstr, 30); 
if (!$fp) { 
    echo "$errstr ($errno)<br />\n"; 
} else { 
    $out = "GET /index.php HTTP/1.1\r\n"; 
    $out .= "Host: localhost\r\n"; 
    $out .= "Connection: Close\r\n\r\n"; 
    fwrite($fp, $out); 
    while (!feof($fp)) { 
    echo fgets($fp, 128); 
    } 

    fclose($fp); 
} 

私が得るすべては出力として「テストB」であると明らかに私は/usr/local/www/b/index.phpで間違った何かを持っています。私はソケット許可の問題だとは思わないので、エラーが出てくると思いますが、$outはこれが動作するのは間違っていますが、PHPが何を受け取るのかは分かりません。どんな助けもありがとう。

注:FreeBSD11

+0

NginxはPHP-FPMプロセスと通信するために 'FastCGI'プロトコルを使用します。なぜあなたは 'HTTP'経由でそれをしようとしていますか? –

+0

Nginxを無視すると、その部分はうまく動作します。基本的には、UNIXのソケットを使用して別のクライアントに接続するPHPスクリプトと、可能であればNginxを経由せずにサーバーを接続します。 – FireLeopard

+0

2番目のスクリプトと通信しているときに、 'FastCGI'プロトも使用する必要があるということです。 –

答えて

2

PHP-FPMにPHP7を使用しては、FastCGIプロセスマネージャです。 FastCGIHTTPは、2つの異なるプロトコルです。したがって、PHP-FPM は、HTTPを直接使用することはできません。

  • 変更script BFastCGI言語をして話すようにBからAへの通信に

    • はnginxの後ろscript Aを入れて、代わりにUnixソケットの後、オープンTCPソケット:

      browser -> (HTTP) -> nginx -> (FastCGI) -> PHP-FPM + scriptB 
      scriptB -> (HTTP) -> PHP-FPM + scriptA 
      

      は、2つのオプションがありますHTTPの代わりにscript Aとなります。

  • +0

    ありがとう、私は最初のオプションを選択しました。それについて考えることは、それを上手にエンジニアリングしようとするよりはるかに優れています。私はFastCGIとHTTPが異なっていたことは知っていましたが、私はPHP-FPMが両方を理解できることを望んでいたと思います。 – FireLeopard

    +0

    ようこそ。しかし、この問題が教育的なものではない場合は、手動でソケットを開く代わりに、 'cURL'や' file_get_contents() 'のようなものを使うことをお勧めします。 –

    +0

    @FireLeopard問題は、 'php-fpm'は' http'サーバではないので、 'http'を理解する必要はありません。 'fastcgi'を話せば、' nginx'、 'apache'、両方のもの、まったく違う何か** Webサーバーの背後に、複数の' php-fpm'サーバーを置くことができます。 HTTPサーバは、 'php-fpm'サーバをアップグレードすることなく、プロトコル' http 1.1'または 'http 2.0'に調整することができます。このすべての理由がありますが、httpをfcgiに変換する方法がありますが、あなたが言ったように、それを誇張するのは最善です。 – Mjh

    関連する問題