音楽歴35年・FLAKE RECORDSの店主DAWAの選ぶセンス光る注目曲ご紹介!

お世話になっております。

fsockopenを使って、証明書付きのSSL通信をして表示内容を取得したいのです。

いろいろ見て回って、下記のようなソースを作りました。

------------------------------------------------------------------------
$context = stream_context_create();
stream_context_set_option($context, 'ssl', 'local_cert', './client.pem');
stream_context_set_option($context, 'ssl', 'cafile', './ca.pem');

$host = "aaa.bbb.ne.jp";
$fp = fsockopen("ssl://{$host}", 443, $errno, $errstr, 10, $context);
------------------------------------------------------------------------

すると、

Warning: fsockopen() expects at most 5 parameters, 6 given

と怒られます。fsockopenに6つ目のパラメータは渡せないってことですよね?

仕方がないので、
$contextをはずしてみると、当然証明ができないので怒られます。

Warning: fsockopen(): SSL operation failed with code 1. OpenSSL Error messages:
error:14094410:SSL routines:func(148):reason(1040) in xxxxxxx~

Warning: fsockopen(): Failed to enable crypto in xxxxxxx~

Warning: fsockopen(): unable to connect to ssl://aaa.bbb.ne.jp:443 (Unknown error) in xxxxxxx~





まる一日解決方法を探し続けているのですが、だめです。

漠然とした内容で申し訳ありませんが、どなたかご教授願えませんでしょうか。

よろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (6件)

幾つかの pem ファイルを指定していることから、SSL クライアント認証が必要なサーバにアクセスしてコンテンツを得たいということですよね?



ソケットを開いて openssl関数を駆使して自前で頑張るのもアリですが、参照URLのとおり面倒なネゴシエーションをしなくてはなりません。
頑張って実装してください。。

って面倒ですよね。もし cURL extension が利用できるのであれば以下のソースが参考になるかもしれません。手元にすぐにSSLクライアント認証が試せる環境がなかったので動作は未検証になります。

<?php
if( function_exists( 'curl_init' ) === FALSE ) {
die( 'cURL 使えないッス!' );
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'aaa.bbb.ne.jp');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // コンテンツはテキスト文字列
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($ch, CURLOPT_CAPATH, 'client.pem のあるディレクトリを指定');
curl_setopt($ch, CURLOPT_CAINFO, 'ca.pem をフルパス指定');
curl_setopt($ch, CURLOPT_SSLCERT, 'client.pem');
curl_setopt($ch, CURLOPT_SSLCERTPASSWD, 'client.pem のパスワードを指定');

// CURLOPT_RETURNTRANSFER を 1 にしているのでresponse body を変数に格納
$result = curl_exec($ch);
curl_close($ch);
echo $result .PHP_EOL
exit;

参考URL:http://alk.dip.jp/apache2-default/sv290.html
    • good
    • 0
この回答へのお礼

ありがとうございます。

ご丁寧にサンプルまで。。。(泣)

curlが使えない状態だったので、PHPのリコンパイルして使えるようになったのですが、

実行しても、実行中のまま変化なしでした。

どうもpfxから変換したpemが怪しいような気がしてきました。

中身が理解できてなくて、コピペだからうまくいかないんですよね。

参考URLなど勉強してもうちょっとがんばってみます。

ありがとうございます。

お礼日時:2010/12/22 11:01

hogehoge78 さんの Zend Framework 簡単でいいですね。


Zend Framework はコンポーネントを単体でライブラリのように使えると聞いたことがあります。#使ったことがないのでわかりません。
導入するのに抵抗がないのであれば HTTP ヘッダをパースしてクッキーにセットしてなど雑多な処理から開放されそうです。

質問者の方の補足の質問ですが、人間がブラウザを利用して操作する事をトレースするわけですから、 curl_init() をリクエスト回数分コールすることになりそうです。

設定したオプションを再利用したいのであれば curl_setopt_array() や curl_copy_handle() があるようですので関数やオブジェクトのメソッドでラッピングして使うと便利そうですね。

先のZend_Http_Clientを使う案も素敵だと思います。

#Webアプリケーションなんでしょうか?だとしたら本来各ブラウザで分散される処理を一手に引き受けるのですからアクセス数によってはCPUぶん回しになりそうですね。接続先はSSLアクセラレータが使えるかもしれませんが、クライアントの振舞いをする側はそうはいきませんし。
    • good
    • 0
この回答へのお礼

>人間がブラウザを利用して操作する事をトレースするわけですから、

そういうことなんですね。

やっとイメージできました。

一応curlを何度かたたくことで実現できました!!

これからZendも試してみようと思います。

未知の世界だったのですが、少し理解することができました。

ありがとうございました!!

お礼日時:2010/12/23 11:19

よこからですみませんが、


HTTPの通信は、一度のリクエストとレスポンスの組ですので、最後にcurl_close関数を叩いたら、
次回もう一度、curl_initをし直す必要があります。

また、curlだけに限らない話ですが、セッションを引き継ぐリクエストを送るときに自前でコードを記述するのは結構手間がかかるので、ZendFrameworkの「Zend_Http_Client」をライブラリとして使ってみてはいかがでしょう。
NARHさんの書かれたスクリプトを参考にして、Zend_Http_Clientを使った記述は、
<?php
/*

Zend Framework ダウンロードはここ
http://framework.zend.com/download/latest

Zend_Http_Clientのマニュアルはここ
http://framework.zend.com/manual/ja/zend.http.cl …

*/

require_once 'Zend/Http/Client.php';

$uri = 'https://example.com';

$config = array(
'adapter' => 'Zend_Http_Client_Adapter_Curl',
'curloptions' => array(
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_SSL_VERIFYHOST => 1,
CURLOPT_SSL_VERIFYPEER => 1,
CURLOPT_CAPATH => 'path',
CURLOPT_CAINFO => 'path/to/ca.pem',
CURLOPT_SSLCERT => 'path/to/client.pem',
CURLOPT_SSLCERTPASSWD => 'password',
),
);

$client = new Zend_Http_Client($uri, $config);
$client->setCookieJar();//セッションを保持できるようにします。
$client->setParameterPost('name', 'value'); //POST値を入力します。

$response = $client->request('POST');

if($response->getStatus() == 200){
$client->setUri('http://example.com/next/page');

$response = $client->request('GET');

}

?>

このようになります。
アダプタとして、curlを使いますので(別のモジュールを選択することも可能)、内部的には、NARHさんのやっていることと同じです。
ソレとは別に、Cookieで取得したセッション用のIDなどを取り持って次の遷移に持込してくれるルーチンが仕込まれています。

ご参考まで。
    • good
    • 0
この回答へのお礼

Zendは使ったことがありませんでした。

とてもわかりやすいサンプルをありがとうございました。

早速試してみます。

お礼日時:2010/12/23 11:16

実は、先ほどのサンプルではポート指定を忘れてました。

(テヘッ!)

curl_setopt($ch, CURLOPT_URL, 'https://aaa.bbb.ne.jp');
でもいけると思います。
#すみません。相変わらず未検証です。

でも pem が上手くいっていなかったらダメなんですが、タイムアウトの指定はできたので、PHP のcURLのマニュアルも参考にしてみてくださいね。

#Web上にあんまりビンゴな資料ってありそうでないですね。
    • good
    • 0
この回答へのお礼

再びありがとうございます!

なんと証明書の件はクリアできました。
pemの件はOKだったようです。


また別の問題が・・・

アクセス先のサイトは、SSL証明書を通過したあと、更にログインの必要があり、
セッションを持ちまわっているようなのです。

その後、必要なパラメータをPOSTして情報を引き出します。

このような場合は、いったんログインページにcurl_initし、

その後検索フォームのページで再びcurl_initするようなイメージでいいのでしょうか。

あつかましくて申し訳ありませんが、もしお分かりのようでしたら

ご教授いただけると助かります。

よろしくお願いいたします。

お礼日時:2010/12/22 17:16

〉No.2


勉強になりました。
ネットワークはきちんと勉強しなくては行けませんね。

質問者さんにも、外した回答してすみませんでした。

とりあえず
stream_context_createで作ったコンテキストつきで通信する場合は、stream_socket_clientが使えます。

http://jp.php.net/stream_socket_client
    • good
    • 0
この回答へのお礼

ありがとうございました。

ネットワーク難しいです。

勉強になります。

お礼日時:2010/12/22 16:48

PHPが、OpenSSLのサポートが有効な状態でインストールされていますか?


その場合であれば、「ssl://」といったスキームを記述してやれば、自動的に暗号化して通信を行うので
そのようなエラーが出てくることは無いと思います。(プロキシかましてたりすると一手間かける必要がありますが・・・)

phpinfo();
あたりで、OpenSSLのサポートが有効になっているか確認してみてはいかがでしょう。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QApache-PHP-fsockopenでSSL通信が出来ない。

----phpinfoの一部---
Apache/2.2.0 (Win32) DAV/2 mod_ssl/2.2.0 OpenSSL/0.9.8a mod_autoindex_color PHP/5.1.1

openssl
OpenSSL support enabled
OpenSSL Version OpenSSL 0.9.8a 11 Oct 2005
-------------------------
OpenSSL0.9.8aをインストール済みでコマンドプロンプトから実行可能な状態。パスも通しています。
--------------------------
<?php

$fp=fsockopen("ssl://www.netsecurity.ne.jp",443);


if (!$fp) {
die("ERROR\n");
}

/* 接続を終了 */
fclose($fp);

?>

これを実行するとIEのステータスバー「https://xxxxxxxx/xampp/1.phpを開いています」と表示されたままになってしまいます。
SSLではない接続だと問題なく接続できます。


winXP xamppです。

「www.netsecurity.ne.jp」は適当にSSL通信できるサイトを見つけてテストしてみましたが…。

設定・テスト方法等、注意すべき点をご指摘いただきたく思います。

----phpinfoの一部---
Apache/2.2.0 (Win32) DAV/2 mod_ssl/2.2.0 OpenSSL/0.9.8a mod_autoindex_color PHP/5.1.1

openssl
OpenSSL support enabled
OpenSSL Version OpenSSL 0.9.8a 11 Oct 2005
-------------------------
OpenSSL0.9.8aをインストール済みでコマンドプロンプトから実行可能な状態。パスも通しています。
--------------------------
<?php

$fp=fsockopen("ssl://www.netsecurity.ne.jp",443);


if (!$fp) {
die("ERROR\n");
}

/* 接続を...続きを読む

Aベストアンサー

$fp = fsockopen("ssl://www.example.com", 443, $errno, $errstr, 30 );

――のように、エラーコード/エラー文字列/タイムアウト時間を指定してデバッグしてみては。

Qポートの80と443

こちらのサービス(https://secure.logmein.com/)を利用すると、インターネットを見られるサーバーのポートの80と443が空いていればルータやファイアウォールに特段の設定なく外部からサーバーを操作できるそうですが、逆にサーバーのポートの80や443を空けることには何か危険性があるのでしょうか。

Aベストアンサー

ポート80は一般的なHTTP、ポート443はHTTPSです。
この2つのポートがあいていなければインターネット接続(WEBブラウジング)は出来ません。
ですから、ほとんどのファイアウォールでこのポートは開いています。(インターネット接続を制限している社内LANでは当然閉じていますが)

ちなみに、よく使うポートとしてはFTPで20、21、SMTP(送信メール)で25、受信メールPOP3で110あたりです。セキュリティポリシー上、この辺は制限される事も多いですが、HTTP 80、HTTPS(暗号化用)443は通常閉じません。


危険性?
WEBプロトコルを使ってFTP的なファイル転送(WebDAV)やVPN等も出来るようになっています。当然そこにはある種の危険はつきものですが、WEBブラウジングに伴う危険と大きく変わりません。ウィルス等に感染していればこの2つのポートだけでも相当危険でしょうね。

参考まで。

Qsyntax error, unexpected '}' というエラーの対処法

PHPを習い始めて三日目になるのですがParse error: syntax error, unexpected '}' in C:\Program Files\Apache Group\Apache2\htdocs\****\****\game.php on line 33
というエラーがでるのですが33行目前後のどこをなおせばいいのでしょうか?
・game.php
<html>
<head>
<title>数当てゲーム</title>
</head>
<body>
<h1 style="background:#cccccc">数当てゲーム</h1>
<form method="POST" action="game.php">
1~100までの数を入力してください
<input type="text" name="answer" size="5" maxlength="3" />
<input type="sbumit" value=回答" />
</form>
<hr />
<?php
session_start();
if(is_null($_SESSION['answer'])){
mt_stand(microtime()*1000000);
$_SESSION['answer']=mt_rand(1,100);
$_SESSION['game_cnt']=0;
}
if($_POST['answer']!=""){
$_SESSION['game_cnt']++;
if($_session['answer']==$_POST['answer']){
print("おめでとうございます".
$_SESSION['game_cnt']."回で正解しました!");
session_destroy();
}else{
if($_SESSION['answer']>$_POST['answer']){
print("もう少し大きいです。");
}else
print("もう少し小さいです。");
}
}
}
?>
</body>
</html>
それとこの間違えたところをなおしたあとはいつもコンピュータを再起動しないと修正したところが適用されないのですがほかに方法はないですか?基本的な質問ですいません。

PHPを習い始めて三日目になるのですがParse error: syntax error, unexpected '}' in C:\Program Files\Apache Group\Apache2\htdocs\****\****\game.php on line 33
というエラーがでるのですが33行目前後のどこをなおせばいいのでしょうか?
・game.php
<html>
<head>
<title>数当てゲーム</title>
</head>
<body>
<h1 style="background:#cccccc">数当てゲーム</h1>
<form method="POST" action="game.php">
1~100までの数を入力してください
<input type="text" name="answer" size="5" max...続きを読む

Aベストアンサー

print("もう少し大きいです。");
}else
print("もう少し小さいです。");
のelseの後に{がないようですが、大丈夫でしょうか?

Qhttpdの子プロセスがゾンビ化する原因

httpdは複数の子プロセスを生成しますが、この子プロセスがゾンビプロセス化してしまう
ことがあります。
このゾンビ化してしまう原因として考えられるものを教えて下さい。

『何らかの理由で子プロセスが停止せずに親プロセスが停止した』等、あいまいな答えでも
構いません。もちろん具体的であれば、とても助かりますが…。

思いつく限りいくつでも構いませんので、教えて下さい。

ちなみに、私が使用しているマシンで上記現象が発生している訳ではなく、一般的な事例として
子プロセスのゾンビ化の原因になり得る事象を知りたいと思っていますので、構成情報などは
あまり気にせずに答えて頂けると幸いです。

よろしくお願いします。

Aベストアンサー

ゾンビプロセス一般について書きます。

ゾンビプロセスとは、プロセスの実体は無いが、プロセステーブル(カーネルがプロセスを管理してる台帳)に
エントリーがある状態を指します。

名簿に名前があるけど、本人は居なくなっちゃってる、と。

あるプロセスが終了したときには、必ず一瞬でもこの状態になります。
通常は、プロセスが終了したというシグナルが親プロセスに通知され、親プロセスが後始末を
してあげて、めでたくゾンビ状態ではなくなるのです。

もし、親がシグナルを受けたときに適切な処理を行っていなければ、親プロセスが終了するか
システムが再起動するまで、ゾンビ状態のままです。

> このゾンビ化してしまう原因として考えられるものを教えて下さい。

子プロセスからのシグナルを受けたときの処理がまずい、のが原因です。

QPHPのTRUEとFALSEについて 値を返すというけれど、なぜ「1」かブランク(何もなし)なのでしょうか?

以下の文を実行すると、$abcには「3」があるので、TRUEになるはずなのですが、
エコーすると「1」と記載されます。

<?php
$abc = "283743";
$abc = ereg("3",$abc);

echo $abc;

?>

以下の文を実行するとエコーしても何も表示されません。
「0」は該当しないので、FALSEと表示されると思うのですが・・。

<?php
$abc = "283743";
$abc = ereg("0",$abc);

echo $abc;

?>

ネットで調べると、それぞれTRUEとFALSEを返すと記載がありました。
それなのになぜ「0」と「何もなし」になるのでしょうか。

Aベストアンサー

まず、eregの戻り値ですが
・マッチした場合は int型の1を返して
・マッチしない場合は bool型のfalseを返す
ようですね(CentOS-CLI版PHP5.2.5で確認)

・・・マニュアルの該当部分を見ると
確かに int で返ると書いてありますが、どうもマニュアルと違うようです・・・。

で、それらが返るとしてechoで表示されない理由ですが
int(1)の場合とfalseの場合で理由が異なります。

まず、falseですが
echo false;
とやると、falseがstring型へ自動型変換という手順を踏んでechoの対象になりますが
PHPの場合は falseをstring型へ変換すると ""(空文字列)になります。
(別の言語では"false"という文字列に変換されるものが多いですね)
よって、出力されません。

次に、int(1)が出力しない理由ですが
> echo $abc;
の部分を
echo $abc . "\n";
として動作確認して貰っていいでしょうか?
多分それで"1"と表示されるようになるはずです。

なぜ、改行文字をつけないと出力されないのかは
理由がわかりません・・・。

まず、eregの戻り値ですが
・マッチした場合は int型の1を返して
・マッチしない場合は bool型のfalseを返す
ようですね(CentOS-CLI版PHP5.2.5で確認)

・・・マニュアルの該当部分を見ると
確かに int で返ると書いてありますが、どうもマニュアルと違うようです・・・。

で、それらが返るとしてechoで表示されない理由ですが
int(1)の場合とfalseの場合で理由が異なります。

まず、falseですが
echo false;
とやると、falseがstring型へ自動型変換という手順を踏んでechoの対象になりますが
P...続きを読む

Qpreg_matchでエラーが出ます。

「PHP Warning: preg_match() expects parameter 2 to be string, array given in~」というエラーが出てきて困っています。

該当する行は下記です。
if( preg_match("/http:\/\/aa.com\//" , $url ) )

真ならば上手く行くのですが、違うアドレスだった場合、エラーが出ます。
当方PHP初心者ですが、助言をお願いします。

Aベストアンサー

2点まちがいがあります

(1)$urlに配列を指定していますね?
preg_matchの第二引数にはstringしか指定できません

http://www.php.net/manual/ja/function.preg-match.php

(2)"/http:\/\/aa.com\//"「.」は「\.」としなくてはいけません

Qapacheユーザの実行権限設定はどうすれば良い?

■環境
・Cent OS

■状況
・所有者hogeのディレクトリxに対して、スクリプト経由(apacheユーザ権限)でchmodしようとすると、エラーになります
・スクリプト経由(apacheユーザ権限)でディレクトリ作成しようとしても、エラーになります

■質問
・どうすれば良いでしょうか?
・所有者hogeのグループにapacheユーザを入れたら効果あるでしょうか?

・ディレクトリ所有者がhogeであることが問題? apache所有にした方が良い?
・それとも、スクリプト実行を、apacheユーザ権限ではなく、所有者hogeにした方が良い? どうやって?

・そもそもapacheユーザ権限は、一般的にどう設定するものなのでしょうか? rootみたいに最強にする?

Aベストアンサー

> 所有者hogeのグループにapacheユーザを入れたら効果あるでしょうか?

基本的にはそれでOKですが、それだけではapacheユーザが作成した
ファイルをhogeユーザが変更できなくなってしまうかもしれません。

user=hoge,group=hoge
user=apache,group=apache,groups=hoge

groupは一次グループ、groups2は二次グループです。umask002 (新
規作成されたファイルのパーミッションが775 ) に設定されている
とします。

hogeユーザが作成したファイルはhoge/hoge なので、hogeグループ
に属するapacheユーザは編集可能です。しかし、apacheユーザが新
規作成したファイルはapache/apache になるので、apacheグループ
に属さないhogeユーザは編集できません。

そこで、ディレクトリをhogeユーザで作成し、ディレクトリにsgid
ビットを立てます。

$ chmod 2775 dir
$ ls -l dir
drwxrwsr-x 2 hoge hoge 4096 4月 7 13:35 dir

これで、apacheユーザがdir上に作成したファイルはapache/apache
ではなく、apache/hoge になるので、hogeユーザも編集できるよう
になります。

> 所有者hogeのグループにapacheユーザを入れたら効果あるでしょうか?

基本的にはそれでOKですが、それだけではapacheユーザが作成した
ファイルをhogeユーザが変更できなくなってしまうかもしれません。

user=hoge,group=hoge
user=apache,group=apache,groups=hoge

groupは一次グループ、groups2は二次グループです。umask002 (新
規作成されたファイルのパーミッションが775 ) に設定されている
とします。

hogeユーザが作成したファイルはhoge/hoge なので、hogeグループ
に属するapacheユーザは編集可能...続きを読む

Qfsockopenのソケットが全然分からないのです

fsockopenのソケットについて教えてください

▽PHP: fsockopen - Manual
  http://php.net/manual/ja/function.fsockopen.php

>fsockopen("www.example.com", 80, $errno, $errstr, 30);

■質問
・ソケットて何ですか?
・この1行にどういう意味があるのでしょうか?
・事前に通信エラーを確認?
・GETとかPOSTとかでエラー判定してはいけないのでしょうか?
・「fsockopenを利用するメリット」と、「どういう時に利用するものなのか」教えてください

■質問背景
・APIコード見てたら、この処理が書かれていたので、調べてみたけど意味が理解できず、質問しました

Aベストアンサー

【Q1】

ソケットて何ですか?

【A1】

ソケットの定義
http://e-words.jp/w/E382BDE382B1E38383E38388.html

「ソケットには、通信を行うアプリケーションソフトがTCP/IPを扱うための仮想的なインターフェースという意味もある。」
こっちの意味です。


【Q2】

この1行にどういう意味があるのでしょうか?

【A2】

fsockopen関数を用いて、www.example.com に ポート80 で接続要求。
通常、HTTPで接続する場合はほとんどのサーバーがポート80を要求する。
接続を最大30秒まで待つ。
それより長引いたら接続失敗とし、FALSEを返す。
それに伴い、$errnoにエラーコード、$errstrにエラーメッセージが代入される。
接続成功したとき、リソース(ファイルポインタ)を返す。
リソースはそのPHPスクリプトが終了するか、fclose関数で意図的に解放するまで使い続けられる。

リソース型について
http://www.sakc.jp/blog/archives/8698


【Q3】

事前に通信エラーを確認?
GETとかPOSTとかでエラー判定してはいけないのでしょうか?

【A3】

意味を取り違えています。
A4参照。


【Q4】

「fsockopenを利用するメリット」と、「どういう時に利用するものなのか」教えてください

【A4】

そもそも$_GETや$_POSTで取得できるものは、「ブラウザ」(閲覧者)から送信された情報だけです。

[リクエスト]
ブラウザ → 自サーバー

<ブラウザ側>
アドレス入力欄にURLを入れて、Enterを押すこと。
そこからの実際のリクエスト処理(リクエストヘッダー送信)は全部ブラウザがやってくれる。
このときはパラメータはGETで送られる。
フォームを用いて、ユーザーを押させて送信させることもでき、そのときはform要素のmethod属性で指定した方法(GETやPOST)が使われる。

<自サーバー>
$_GETや$_POSTなどでクエリを受け取ることも出来る。

[レスポンス]
ブラウザ ← 自サーバー

<自サーバー>
普通にHTMLとして記述したものや、<?php?>内でechoするなどして出力したものをブラウザ側にHTMLとして返す。
<ブラウザ側>
HTMLを解析し、Webページとして表示することは全部ブラウザがやってくれる。

一方、fsockopen関数は、「接続先サーバー」との通信に使います。

[リクエスト]
自サーバー → 接続先サーバー

<自サーバー>
fsockopen関数を使う場合、実際のリクエスト処理(リクエストヘッダー)を全て自分で記述しなければならない。
リクエストヘッダーはfwrite関数で送信する(書き込む)。
<接続先サーバー>
$_GETや$_POSTなどでクエリを受け取ることも出来る。

[レスポンス]
自サーバー ← 接続先サーバー

<接続先サーバー>
普通にHTMLとして記述したものや、<?php?>内でechoするなどして出力したものをブラウザ側にHTMLとして返す。
<自サーバー>
fsockopen関数を使う場合、レスポンスはfgets関数を繰り返して取得する。
通常、feof関数がTrueを返すまで(ファイルポインタが末尾に達するまで)ループさせる。
ループが終わって、fgets関数で取得していった文字列を全て繋げると、レスポンスヘッダー(通信状態を記したもの)とレスポンスボディ(HTMLソース)が連続する2つの改行によって区切られていることが分かる。通常、これをexplode関数を使うなりして分割して使う。


【まとめ】

分かりやすく言えば、「ソケット通信をPHPスクリプトに記述する」ということは、「PHPスクリプトをあたかもブラウザのように動かす」、という言い方も出来るかもしれません。


【サンプルコード】

例: Yahoo!JAPANのトップページをfsockopen関数を用いて取得し、HTML特殊文字をエスケープして表示

http://ideone.com/kMxEIH

【Q1】

ソケットて何ですか?

【A1】

ソケットの定義
http://e-words.jp/w/E382BDE382B1E38383E38388.html

「ソケットには、通信を行うアプリケーションソフトがTCP/IPを扱うための仮想的なインターフェースという意味もある。」
こっちの意味です。


【Q2】

この1行にどういう意味があるのでしょうか?

【A2】

fsockopen関数を用いて、www.example.com に ポート80 で接続要求。
通常、HTTPで接続する場合はほとんどのサーバーがポート80を要求する。
接続を最大30秒まで待つ。
それより長引いたら接続失...続きを読む

Qillegal string offset

php5.3では動いていたプログラムをphp 5.4 で動かしたらwarning illegal string offsetが出て困っています。以下のプログラムでwarningが出ないようにするにはどのようにコーディングすればよいのでしょうか?


$a = array('exists' => 'foo');
if ($a['exists']['non_existent']) {
print 1;
}
print 2;
exit;

Aベストアンサー

isset()を使えばいいと思います


人気Q&Aランキング