ホームページ > バックエンド開発 > PHPチュートリアル > 緊急100点! !名前付きパイプの問題

緊急100点! !名前付きパイプの問題

WBOY
リリース: 2016-06-23 13:47:13
オリジナル
797 人が閲覧しました

名前付きパイプ、読み取りと書き込みはそれぞれ Reader.php と Writer.php です (以下のコードを参照)。
次に、ブラウザーで Writer.php を実行してパイプにデータを書き込み、シェルで Reader.php を実行してデータを読み取る必要があります。
問題は、書き込みは成功しても、データを読み取ることができないことです。
PHP ドキュメントには、両方のパーティの UID がセーフ モードでチェックされると記載されていますが、それらを一貫したもの (両方とも 48) に設定しても機能しません (ドキュメントには、セーフ モードが PHP 5.4.0 で削除されたことが示されています)。読み取りと書き込みがブラウザまたはシェルを通じて行われる場合、読み取りと書き込みは正常に実行されます。
何が起こっているのですか?どうやって解決すればいいでしょうか?ありがとう!

オペレーティング システム: CentOS 7.0 64 ビット
php: 5.6.0

Reader.php

<?php$pipe = "/tmp/xpipe";$mode = 0600;//posix_setuid(8899);posix_setuid(48);if(!file_exists($pipe)) {   echo "create pipe.\n";   umask(0);   posix_mkfifo($pipe,$mode);}//posix_setuid(48);echo "posix uid: ".posix_getuid()."\n";echo "my uid: ".getmyuid()."\n";$f = fopen($pipe,"r");while(true){    $ret = stream_get_line($f, 1024, "\n");    if($ret != false){        echo $ret."\n";    }else{        usleep(100000);    }}?>
ログイン後にコピー


Writer.php
<?php$pipe = "/tmp/xpipe";$mode = 0600;//posix_setuid(8899);posix_setuid(48);if(!file_exists($pipe)) {   umask(0);   posix_mkfifo($pipe,$mode);}$f = fopen($pipe,"w");$msg = "some message [".Date("Y-m-d h:i:s")."]<br>\n";$ret = fwrite($f,$msg);echo "write pipe: ".$ret."<br>\n";fclose($f);//posix_setuid(48);echo "user: ".get_current_user()."<br>\n";echo "posix uid: ".posix_getuid()."<br>\n";echo "my uid: ".getmyuid()."<br>\n";echo $msg;?>
ログイン後にコピー


ディスカッションへの返信 (解決策)

$mode = 0600;間違っているはずです
少なくとも 0644 である必要があります

同じユーザーを使用して、reader.php と Writer.php をそれぞれ実行しました

実行結果は成功しました

$mode = 0600; ?それは間違っているはずです
少なくとも 0644 である必要があります



zuning 先生はいつもフォーラムで活発に活動していますが、なぜそんなに時間がありますか、何をしますか

Web モードで php と php を使用するにはどうすればよいですか?シェルはどうでしょうか?

退職して自宅で自由に過ごします

$mode = 0600;間違っているはずです
少なくとも 0644 である必要があります


0666 も試しましたが、うまくいきませんでした。
get_current_user と posix_getuid を使用してユーザーと uid が同じであるのは奇妙です

同じユーザーを使用してそれぞれ Reader.php と Writer.php を実行します

実行結果は成功です



実行シナリオは私と同じですか?

Halo~~~

環境 1:
オペレーティング システム: CentOS 7.0
PHP: 5.6.0
Apache: 2.4.6

環境 2: オペレーティング システム: 13.10
PHP: 5.5.3
Apache: 2.4.6

「環境 1」は読み取りと書き込みに失敗しましたが、「環境 2」は読み取りと書き込みに成功しました。 ! ! ! ! !
誰か解決を手伝ってくれませんか?実際の動作環境は「環境1」です

Halo~~~



オペレーティングシステム: CentOS 7.0 PHP: 5.6.0 Apache: 2.4.6


環境 2:

オペレーティング システム: Ubuntu 13.10 PHP: 5.5.3 Apache: 2.4.6

「環境 1」は読み取りと書き込みに失敗しましたが、「環境 2」は読み取りと書き込みに成功しました。 ! ! ! ! !
誰か解決を手伝ってくれませんか?私の実際の動作環境は「環境 1」です

/var/log/security を確認してください。RH シリーズには通常、解決されていない SELinux 権限があります


Halo~~~


環境 1:

オペレーティング システム。 : CentOS 7.0 PHP: 5.6.0 Apache: 2.4.6


環境 2:

オペレーティング システム: Ubuntu 13.10 PHP: 5.5.3 Apache: 2.4.6

ronment 1" の読み取りと書き込みに失敗しました、「環境 2」の読み取りと書き込みが正常に完了しました。 ! ! ! ! !
誰か解決を手伝ってくれませんか?私の実際の動作環境は「環境 1」です。

/var/log/security を確認してください。RH シリーズには通常、解決されていない SELinux 権限があります


SELinux は有効になっておらず、常に閉じられています。これは PHP に大きな影響を与えます。以前はいくつかの問題があったため、長い間 PHP をチェックしていましたが、その後完全に閉じてしまいました。
display_errors をオンにして、システム/PHP/Apache/セキュリティ ログを確認してください。失敗は常にログに残ります。この種の名前のないエラー ログが最良の突破口です。ソリューションのアプリケーション要件が Apache の要件と同じであるかどうかを確認します。要件が十分であり、同じアプリケーションのものである限り、問題はありません。エラーがない場合は、エラーを変更してください。など、内容をキャプチャして確認してください

?? は限定的なエラーであり、エラーの意味を確認する必要があります 制限が十分で同じである限り、アプリケーションは同じですか?正しいアプリケーションが見つからない場合は、エラーを待って内容をキャプチャして確認してください

権限がコードに設定されており、ログがすべて開いています。プロンプト。 CentOS の問題だと思いますが、どこに問題があるのか​​わかりません。

オペレーティング システムのため、centos7 ではすべてを Web 経由で行う必要があります。curl を使用してシェルの下で Web リクエストを開始し、パイプラインのもう一方の端を有効にすることができます。
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート