ブログパーツのPHP化で、ソケット対応をしたので、記録しておく。
- PHPがインストールされているかチェックする
<script src="http://code.jquery.com/jquery-1.6.2.min.js"></script> <script> $(document).ready(function() { //POSTメソッドで送るデータを定義します var data = {パラメータ名 : 値}; var data = {request : $('#request').val()}; $.ajax({ type: "POST", url: "send.php", data: data, success: function(data, dataType) { if (data.slice(0,2)=="OK") { document.getElementsByName('jsphp')[0].value = "PHP"; document.getElementById('ifrm').outerHTML = '<iframe id="WPifrm" frameborder=0 height=8 src="" ></iframe>'; } else document.getElementByName('jsphp')[0].value = "legacy"; }, error: function(XMLHttpRequest, textStatus, errorThrown) { // レガシーモードのまま document.getElementByName('jsphp')[0].value = "legacy"; } }); return false; }); </script>
- send.php
<?php header("Content-type: text/plain; charset=UTF-8"); if (isset($_POST['request'])) { echo "OK"; } else { echo 'The parameter of "request" is not found.'; } ?>
- HTMLページのソケット読み
//ソケットでデータを取得 by 村田佑介、 SSL追加 by Fujii function data_get($url,$authuser="",$authpass=""){ global $base; unset($basic); $tmp = parse_url($url); if($tmp['query']){ $tmp['path'] .= "?".$tmp['query']; } if($tmp['fragment']){ // $tmp['path'] .= "#".$tmp['fragment']; } if ($tmp['scheme']=="http") $fp = fsockopen($tmp['host'], 80, $errno, $errstr, 4); // 80番ポートに接続 elseif ($tmp['scheme']=="https") $fp = fsockopen("ssl://".$tmp['host'], 443, $errno, $errstr, 4); // 443番ポートに接続 else print "Scheme invalid. {$tmp['scheme']}"; if(!$fp){ print $errno.":".$errstr; return array("status" => "connect_fail","msg" => $errstr); } $base = $tmp['scheme']."://".$tmp['host']."/"; $out = "GET {$tmp['path']} HTTP/1.1\r\n"."Accept: */*\r\n"."Content-Type: application/x-www-form-urlencoded\r\n"; $out .= "Host: {$tmp['host']}\r\n"; $out .= "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36\r\n"; if($authuser){ $out .= "Authorization: Basic ".base64_encode($authuser.":".$authpass)."\r\n"; } $out .= "Connection: Close\r\n\r\n"; fwrite($fp, $out); stream_set_timeout($fp, 4); //コンテンツ部分の受信 $in = ''; while (!feof($fp)) { $in .= fgets($fp, 4096); } fclose($fp); //ヘッダーとコンテンツ部分に分割 $in = explode("\r\n\r\n",$in); //ヘッダーを配列に格納 $info = decode_header($in[0]); if ($info['status']=="301" || $info['status']=="302") { // Moved Parmanentry or Temporary print $info['location']."<br>"; if (substr($info['location'],0,6)=="/leaf/") // goo,OCNの深い層 return(put_dict("http://".$tmp['host'].$info['location'], '<!--wordTitle-->','<!--/wordTitle-->','+')); else { return(data_get(((substr($info['location'],0,4)=='http')? "":$tmp['scheme']."://".$tmp['host']).$info['location'], $authuser,$authpass)); } } //デコード unset($in[0]);//ヘッダー削除 $in = join("\r\n\r\n",$in); $body = decode_body($info, $in); return mb_convert_encoding($body, "UTF-8","auto"); } function decode_header($str){ //<CRLF>ごとに分割 $part = preg_split("/\n/", $str, -1, PREG_SPLIT_NO_EMPTY); $out = array (); for ($h = 0; $h < sizeof($part); $h++) { if ($h != 0) { // :で区切ってkeyとvalueを作成 $pos = strpos($part[$h], ':'); $k = strtolower(str_replace(' ', '', substr($part[$h], 0, $pos))); $v = trim(str_replace("\r", '',substr($part[$h], ($pos + 1)))); } else{ //1行目ステータスコード $k = 'status'; $v = explode (' ', $part[$h]); $v = $v[1]; } //keyとvalueを配列に格納 if ($k == 'set-cookie') $out['cookies'][] = $v; else $out[$k] = $v; } return $out; } function decode_body ($info, $str, $eol = "\n"){ $tmp = str_replace("\r", '',$str); $add = strlen($eol); //チャンク形式の判定 if (isset($info['transfer-encoding']) && ($info['transfer-encoding'] == 'chunked')) { do { //チャンクサイズを取得して10進数に変換 $tmp = ltrim($tmp); $pos = strpos($tmp, $eol); $len = hexdec(substr($tmp, 0, $pos)); if (!is_int($len)) break; //圧縮転送されている場合解凍する if (isset($info['content-encoding'])) { $str2 .= gzinflate(substr($tmp, ($pos + $add + 10), $len)); } else{ $str2 .= substr($tmp, ($pos + $add), $len); } $tmp = substr($tmp, ($len + $pos + $add)); $check = trim($tmp); } while (!empty($check)); } elseif(isset($info['content-encoding'])) { //圧縮転送されている場合解凍する $str2 = gzinflate(substr ($tmp, 10)); } else $str2 = $str; return $str2; } ?>