問題タブ [php-socket]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
php - PHPで制御文字をソケットに送信するにはどうすればよいですか?
私が書いている PHP スクリプトでは、以前に作成したネットワーク ソケットに control+z 文字を送信する必要があります。ctrl+z 文字が chr(26) であることを理解しているので、送信する文字列の最後に次のように新しい行 (\r\n) を追加し、次に chr(26) を追加しました。
悲しいことに、これは Ctrl+Z を送信していません。
よろしく、
ジョン
php - PHP: pcntl_alarm() と socket_select() は平和的に同じスレッドに存在できますか?
チャット クライアントが接続するためのチャット サーバーとして機能する PHP CLI スクリプトを主に作成しています (なぜ PHP でそれを行っているのかは聞かないでください。それは別の話です)。
私のスクリプトは、socket_select() 関数を使用して、ソケットで何かが発生するまで実行を停止します。その時点で、ソケットは起動し、イベントを処理し、次のイベントまで待機します。ここで、30 秒ごとに実行する必要のあるルーチン タスクがいくつかあります (tempban されたユーザーの禁止を解除する必要があるかどうかを確認し、ユーザー データベースを保存し、その他のさまざまなことを行います)。
私が言えることは、PHP には非常に優れたマルチスレッド サポートがまったくないということです。私が最初に考えたのは、ソケットがイベントを生成し、プログラムが再び流れるたびにタイムスタンプを比較することでしたが、サーバーが何時間もアイドル状態のままで、クリーンアップ ルーチンが実行されない可能性があるため、これは非常に一貫性がありません。
PHP pcntl 拡張機能に出会いました。これにより、SIGALRM が送信される時間間隔を割り当て、送信されるたびに関数が実行されます。これは私の問題に対する理想的な解決策のように思えますが、pcntl_alarm() と socket_select() がかなり衝突します。SIGALRM がトリガーされるたびに、ソケット制御コードにあらゆる種類のクレイジーなことが起こります。
私のプログラムはかなり長いので、ここにすべてを投稿することはできませんが、コードに関して何か間違ったことをしているとは思わないので、問題ではありません。私の質問は: SIGALRM を待機中の socket_select() と同じスレッドで処理する方法はありますか? もしそうなら、どのように?そうでない場合、ここで私の代替手段は何ですか?
これが私のプログラムからの出力です。私のアラーム機能は単に「Tick!」を出力します。呼び出されるたびに、いつ何かが起こっているかを簡単に知ることができます。これは、4回ティックを許可した後の出力(エラーを含む)です(サーバーへの実際の接続試行はありませんでした):
[05-28-10 @ 20:01:05] チャット サーバーが 192.168.1.28 ポート 4050 で開始されました
[05-28-10 @ 20:01:05] ファイルから 2 人のユーザーを読み込みました
PHP 通知: 未定義のオフセット: 112 行目の /home/danny/projects/PHPChatServ/ChatServ.php の 0
PHP 警告: socket_select(): [4] を選択できません: 116 行目の /home/danny/projects/PHPChatServ/ChatServ.php でシステム コールが中断されました
[05-28-10 @ 20:01:15] カチカチ!
PHP 警告: socket_accept(): 着信接続を受け入れることができません [4]: 126 行目の /home/danny/projects/PHPChatServ/ChatServ.php でシステム呼び出しが中断されました
[05-28-10 @ 20:01:25] カチカチ!PHP 警告: socket_getpeername() は、パラメーター 1 がリソースであると想定しており、129 行目の /home/danny/projects/PHPChatServ/ChatServ.php で指定されたブール値です
[05-28-10 @ 20:01:25] PHP からのソケット接続の受け入れ通知: 未定義のオフセット: 1 の /home/danny/projects/PHPChatServ/ChatServ.php 行 112
PHP 警告: socket_select(): [4] を選択できません: 116 行目の /home/danny/projects/PHPChatServ/ChatServ.php でシステム コールが中断されました
[05-28-10 @ 20:01:35] カチカチ!
PHP 警告: socket_accept(): 着信接続を受け入れることができません [4]: 126 行目の /home/danny/projects/PHPChatServ/ChatServ.php でシステム呼び出しが中断されました
[05-28-10 @ 20:01:45] カチカチ!
PHP 警告: socket_getpeername() は、パラメーター 1 がリソースであると想定しており、129 行目の /home/danny/projects/PHPChatServ/ChatServ.php で指定されたブール値です
[05-28-10 @ 20:01:45] からのソケット接続を受け入れています
PHP Notice: Undefined offset: 2 in /home/danny/projects/PHPChatServ/ChatServ.php 行 112
php-socket - ソケットプログラムは、まだTIME_WAITにあるポートに接続できます
- 私は非常に単純なソケットサーバーを作成しました。
- ポスト63254でリッスンします。
- 最初にsocket_create、socket_bind、socket_listenを実行したので、ここで接続がリッスンしています。
- 次に、ループでソケットaccpetを実行します。だからここで別の話を聞いてください。
- 読み取り関数は、入力出口まで読み取ります。
- その後、socket_acceptによるリソースIDが閉じます。
- その後、メイン接続が閉じます。
すべての接続を閉じた後、TCPviewでこのプロセスを確認すると、63254以降のTIME_WAITを示すシステムプロセスが表示されます。
接続しているソケットサーバープログラムを再度実行すると、1つの完全なプロセスが終了すると、すべての接続が閉じられ、プログラムが終了し、同じポートに対して別のTIME_WAITが表示されます。それでも、3回目に同じポートに接続できました。
スタックオーバーの質問の回答では、待機状態のポートに対して接続を行うことができないと言われています。
Firefoxブラウザを開いて4つの接続を開きました。私がそれを閉じたとき、それはすべて閉じられ、システムプロセスは2分間の4回の待機を示しました。すべての時間待機は2分間滞在し、消えます。
したがって、私が結論付けるのは、接続が閉じるたびに待機時間が発生し、回避できないということです。
私はスタックオーバーフローフローで多くの投稿を読みましたが、それでも確信が持てませんでした。
コマンドラインで次のコードを実行します。
私のサーバーコード
クライアントコード
これが十分でない場合は、より良いクライアントサーバーを改善するための提案が必要です。このコードは単なる子供の遊びです。コミュニケーションの仕組みを理解しようとしているだけです。
serial-port - ウェブサイトからシリアルポートにバイトを送信しています
PHP を使用してリモート Web サイトから PIC チップに接続された別のコンピュータのシリアル ポートにバイトを送信するにはどうすればよいですか?
java - PHPソケットはJavaサーバーからjson配列を読み取ります
TCP/IP を使用して Java で記述されたサーバーに接続しています。私のアプリケーションは json 配列をこのサーバーに送信し、場合によっては、json 配列の結果も予期します。問題は、tcp経由でjsonを簡単に送信できることですが、それを読み取ると、スクリプトがフリーズし、タイムアウトするまで永遠に待機します。これが私のコードです。
$send は、json_encode($array) としてエンコードされた配列です。
送信は問題ありませんが、受信する必要があるときに何も取得しません。
可能であれば、jquery(サーバーからjsonオブジェクトを送信および取得する)を使用してこれを処理してもかまいません。私はこのようなことを達成する実装を認識していませんが、私は提案を受け入れています...実際にはphpの代わりにそれを好むでしょう.
php - telnetに接続してコマンドを送信し、phpを使用して出力をテキストファイルに書き込む方法
ポートにtelnetしてコマンドを送信し、PHPを使用して出力をtxtファイルに書き込む必要があります。どうすればよいですか?
このフォーラムでは、PHPを使用した同じ質問名のtelnet接続がありますが、ソリューションリンクがあり、ソリューションリンクが開いていないため、もう一度質問する必要があります。
また、 phpサイトから以下のコードを試しましたが、適切な出力がテキストファイルに保存されません。コード:
だから、私が問題を解決するのを手伝ってください。ローカルホストポート80にtelnetで接続し、コマンドGET / HTTP / 1.1を送信して、出力をテキストファイルに書き込むにはどうすればよいですか?
php - PHP を使用して telnet セッションをタイムアウトする方法
PHP を使用して telnet セッションから切断する方法は?以下のコードを使用して、telnet 出力を読み取ります。しかし、$output 変数で 3 秒以内にデータを受信できない場合は、telnet セッションから切断したいと考えています。以下のコードを参照してください。
php - cURL マルチによって開かれているソケットが多すぎます
cURL multi を使用して、いくつかの Web サイトからデータを取得しています。コード付き:
しかし、問題は cURL が開いているソケットが多すぎて Web サーバーに接続できないことです。各接続、cURL は Web サーバーへの新しいソケットを作成します。現在の接続を次の接続のためにキープアライブにしたい。100個のURLが必要ない場合、cURLは処理するために100個のソケットを作成する必要があります:(
私を助けてください。本当にありがとう !
asterisk - PHPソケット、Asterisk AMIからイベントを受信するためのサーバーへの永続的な接続?
リモートソケットからデータを受信するためのミニ「デーモン」として機能するPHPスクリプトを作成しようとしています。リモートサーバーはAsteriskVoIPサーバーであり、AMIイベント通知を受信するためにAsterisk Management Interface(AMI)に接続します。接続は、これまでの使用に十分安定している常時接続のSSHトンネル(autosshを使用)を介して行われます。
これが計画です...
- SSHトンネルのローカルポートに接続するPHPスクリプト。これは、他端のリモートポートに転送します
fsockopen()
。pfsockopen()
- PHPスクリプトはCLIから実行されます。何らかの理由で、PHPスクリプトが停止していないことを確認するために、cronジョブに何らかのシェルスクリプトが必要だと思います。
- このPHPスクリプトを永続的に実行し、ソケットに永続的に接続して、データが相手側から公開されるたびにデータを受信する必要があります。
- イントラネットサーバーには十分なリソースがあるため(犯罪的に十分に使用されていないため)、メモリとCPUは問題になりませんが、同様に、このスクリプトが制御不能になることは望ましくありません。
- PHPスクリプトは、ソケットの反対側に時折表示されるデータに反応し、MySQLデータベースにデータを挿入または更新する場合があります。もちろん、MySQL接続をハングさせたままにするのではなく、必要に応じて開閉します。
まず第一に、これは決してうまくいかないひどい考えですか?
PHPは、このような小さなデーモンにはおそらく最適な言語ではないことを認識していますが、以前はCLIでPHPを使用して成功したことがあり、最近では最も快適な言語です。
ソケットのもう一方の端でデータが公開されたときに動作を開始できるPHP関数はありますか?
またはfread()
、このようにループするだけでしょうか...
ループオプションは少し混乱しているように見えるので、スクリプトがソケットに接続されたままで、基本的にデータが表示されるまでアイドル状態になる別の方法があるかどうか疑問に思っています。
永続的に実行されているPHPスクリプトをソケットに接続することを検討する場合、どのような短所/落とし穴に注意する必要がありますか?
乾杯、B
php - Apache Thrift API と通信するための PHP クライアント
私はPHP開発者で、Apache Thrift APIを使用して別のサーバーと通信するサイトで作業しているため、PHPでThrift APIと通信するために使用できる既存のクラスまたは方法があることを知りたい. Tsocket を使った Python で書かれたサンプルを見たことがありますが、PHP に Tsocket クラスがあるかどうかはわかりません。したがって、誰かがそのような作業を行った場合は、サンプルを投稿するか、PHP でthrift API クライアントを実装するために使用できるクラスについて教えてください。
みんなの努力に前もって感謝します。