目次

参考

インストール

Linux

sudo apt-get install php5 libapache2-mod-php5

Windows

くぁwせdrftgyふじこlp;@:「」

プログラム作成

おまじない

<?php
	プログラム
?>

コメント

<?php
	// コメントアウト
	
	# コメントアウト
	
	/*
		コメントアウト
	*/
?>

文法

Linuxでスクリプトの書き方と同じ感じ。

C言語とかのように型の定義をする必要なし。

変数

  1. 変数は「$」で始める。
  2. 変数に使える文字は英字、数字、アンダーバー(_)のみ。
  3. 変数名の始まりに数字は使えない。
  4. 変数名の大文字と小文字は区別される。
<?php
  $hello = "Hello, world!";
  print($hello);
?>

出力結果

Hello, world!

ヒアドキュメント

ヒアドキュメントとは、PHP内にまとまった文章を直接記述し、表示や変数に代入する方法。

「EOF」は他の文字でもいいが、始めと最後を統一すること!

  • 開始IDの注意点
  1. 開始IDの前後に全角空白があるとIDはその空白も含めたものになる
  2. 開始IDの後ろにタブと半角スペースは入れられない。
  3. <<< とIDの間にはタブと半角スペースを入れられる。
  4. 開始IDの後ろにはコメントもつけられない。
  • 終端IDの注意点
  1. 終端IDは必ず行頭に置かなくてはならない。
  2. 終端IDの行には「;」(セミコロン)以外置いてはならない。
  3. タブやスペースでのインデントもセミコロンの前後に空白を置くのもだめ
  4. コメントつけるのも却下
<?php

$str = <<< EOF
<html>
    <head>
       <title>KWIC</title>
    </head>
    <body>
EOF;

print($str);

?>

または

<?php

print <<< EOF
<html>
    <head>
       <title>KWIC</title>
    </head>
    <body>
EOF;

?>

出力結果

<html>
    <head>
       <title>KWIC</title>
    </head>
    <body>

配列

C言語同様に配列を扱うことができる。

出力には「print_r(配列名)」を使うことで配列を全て表示すことができる。

<?php
  $ary[0]="Red";
  $ary[1]="Green";
  $ary[2]="Blue";
  print_r($ary);
?>

出力結果

Array ( [0] => Red [1] => Green [2] => Blue )

また、「C++」や「Java」と同じように連想配列を使用することもできる。

<?php
  $color['Apple']="Red";
  $color['Cloud']="White";
  $color['Water']="Blue";
  print_r($color);
?>

出力結果

Array ( [Apple] => Red [Cloud] => white [Water] => Blue )

ソース置き場

PHPでフォームを介さずにGET/POST送信

参考ページのソースの方は微妙に間違ってるので注意!

参考

http://weble.org/2011/03/07/php-get-and-post-function

GET送信

echo wbsRequest('GET', 'http://himado.in/', Array('sort' => 'movie_id'));

POST 送信

echo wbsRequest('POST', 'http://caloreen.com/search/', Array('keyword' => 'パン'));

ソース1

function wbsRequest($method, $url, $params = array()){
	$data = http_build_query($params);
	$header = Array(
		"Content-Type: application/x-www-form-urlencoded",
		'User-Agent: Mozilla/5.0 (X11; U; FreeBSD amd64; en-US; rv:1.9.2.2) Gecko/20100324 Firefox/3.6.2',
		// ベーシック認証
		//'Authorization: Basic '.base64_encode('id:pw'),
		'Referer: '.'http://hogehoge.com/',
	);
	$options = array('http' => Array(
		'method' => $method,
		'header'  => implode("\r\n", $header),
		// プロキシサーバ
		//'proxy' => 'tcp://proxy.example.com:5100',
		// HTTP プロトコルのバージョン(デフォルト1)(PHP5.1.0以降)
		'protocol_version' => 1.0,
		// リダイレクトをたどる最大数(=指定回数-1)(PHP5.1.0以降)
		'max_redirects' => 2,
		// 読み込みタイムアウト秒数(PHP 5.2.1以降)
		'timeout' => 1.0,
	));
	$res = get_headers($url);
	if(preg_match("/(404|403|500)/",$res['0'])){
		return false;
	}
	if($method == 'POST'){
		$options['http']['content'] = $data;
		$content = file_get_contents($url, false, stream_context_create($options));
	}else{
		$content = file_get_contents($url . '?' . $data, false, stream_context_create($options));
	}
	return $content;
}

ソース2 - cURL版

ソース1より2倍弱ほど高速で処理できる

http://phpjavascriptroom.com/?t=php&p=curl

function wbsRequest2($method, $url, $params = array()){
	$data = http_build_query($params);
	if($method == 'GET') {
		$url = ($data != '')?$url.'?'.$data:$url;
	}
	
	$ch = curl_init($url);
	
	if($method == 'POST'){
		curl_setopt($ch,CURLOPT_POST,1);
		curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
	}
	
	// header情報も一緒に欲しい場合
	//curl_setopt($ch, CURLOPT_HEADER,true);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
	curl_setopt($ch, CURLOPT_TIMEOUT, 2);
	$res = curl_exec($ch);
	
	// ステータスをチェック
	$respons = curl_getinfo($ch, CURLINFO_HTTP_CODE);
	if(preg_match("/^(404|403|500)$/",$respons)){
		return false;
	}
	
	return $res;
}

Digest認証

たぶん何か間違ってる。。。

test http://www.maido3.com/server/script/htaccess-digest.html

http://www.studyinghttp.net/auth
http://shain.blog.conextivo.com/2007/03/phpdigest.html
http://k-ishik.seesaa.net/article/112362717.html
http://x68000.q-e-d.net/~68user/net/http-auth-2.html

	$url = "http://hogehoge.com";
	$id = "ユーザ名";
	$pw = "パスワード";
	$method = "POST"; // POSTまたはGET
	
	$res = get_headers($url);
	
	$word=$res[3];
	// realm
	$realm = strstr($word, 'realm="');
	$realm = str_replace('realm="', '', $realm);
	$delete_word = strstr($realm, '"');
	$realm = str_replace($delete_word, '', $realm);
	// nonce
	$nonce = strstr($word, 'nonce="');
	$nonce = str_replace('nonce="', '', $nonce);
	$delete_word = strstr($nonce, '"');
	$nonce = str_replace($delete_word, '', $nonce);
	// uri
	$uri=$url;
	// algorithm
	$algorithm = strstr($word, 'algorithm=');
	$algorithm = str_replace('algorithm=', '', $algorithm);
	$delete_word = strstr($algorithm, ',');
	$algorithm = str_replace($delete_word, '', $algorithm);
	// qop
	// qop="auth,auth-int"の場合どちらか一つ?
	$qop = strstr($word, 'qop="');
	$qop = str_replace('qop="', '', $qop);
	$delete_word = strstr($qop, '"');
	$qop = str_replace($delete_word, '', $qop);
	// nc
	$nc = "00000001";
	// cnonce
	$cnonce = uniqid();
	// response
	$hash_1  = md5(sprintf("%s:%s:%s", $id, $realm, $pw));
	$hash_2  = md5(sprintf("%s:%s", $method, $uri));
	$hash_3  = md5(sprintf("%s:%s:%s:%s:%s:%s", $hash_1, $nonce, $nc, $cnonce, $qop, $hash_2));
	$response = $hash_3;
	
	$authorization = "Authorization: Digest username=\"{$id}\", realm=\"{$realm}\", nonce=\"{$nonce}\", uri=\"{$uri}\", algorithm={$algorithm}, qop={$qop}, nc={$nc}, cnonce=\"{$cnonce}\", response=\"{$response}\"";

ベンチマーク

パフォーマンス比較するために作ってみた

※ 誤差があるので目安程度に

benchmark.inc

<?php
	class joshimane{
		var $row;
		var $error_range=0;
		function start(){
			$this->reset();
			$this->row[]=array("marker"=>"Start", "time_index"=>$this->microtime_float(), "ex_time"=>"-", "perct"=>"0.00%");
		}
		function stop(){
			$time_index = $this->microtime_float();
			$this->row[]=array("marker"=>"Stop", "time_index"=>$time_index, "ex_time"=>$this->ex_time($time_index), "perct"=>"0.00%");
			$max = count($this->row)-4;
			for($i=1,$ex_time_sum=0;$i<$max;$i++){
				$ex_time_sum += $this->row[$i][ex_time];
			}
			$this->row[]=array("marker"=>"Total", "time_index"=>"-", "ex_time"=>$ex_time_sum, "perct"=>"100.00%");
			for($i=1;$i<count($this->row)-5;$i++){
				$this->row[$i][perct] = number_format(round(($this->row[$i][ex_time] / $ex_time_sum)*100, 2), 2)."%";
			}
		}
		function setMarker($name){
			$time_index = $this->microtime_float();
			$this->row[]=array("marker"=>$name, "time_index"=>$time_index, "ex_time"=>$this->ex_time($time_index), "perct"=>"0.00%");
		}
		function microtime_float(){
			list($usec, $sec) = explode(" ", microtime());
   		return((float)$usec + (float)$sec);
		}
		function ex_time($time_now){
			 return ($time_now - $this->row[count($this->row)-5][time_index]);
		}
		function display(){
			echo "<table border=1 cellspacing=0 cellpadding=5 align=center>\n";
			echo "<tr><td>marker</td><td>time_index</td><td>ex_time</td><td>perct</td></tr>\n";
			$max = count($this->row)-4;
			for($i=0;$i<$max;$i++){
				echo "<tr><td>{$this->row[$i][marker]}</td><td>{$this->row[$i][time_index]}</td><td>{$this->row[$i][ex_time]}</td><td style=\"text-align:right;\">{$this->row[$i][perct]}</td></tr>\n";
			}
			echo "</table>\n";
		}
		function run($num, $func, $arg){
			$this->start();
			for($i=0;$i<$num;$i++){
				$func($arg);
				$this->setMarker($i);
			}
			$this->stop();
		}
		function ave(){
			$max = count($this->row)-6;
			for($i=1,$sum=0;$i<$max;$i++){
				$sum += $this->row[$i][ex_time];
			}
			return($sum/($max-1));
		}
		function reset(){
			$this->row = array("marker"=>"marker", "time_index"=>"time_index", "ex_time"=>"ex_time", "perct"=>"perct");
		}
		function test($num){
			for($i=0,$sum=0;$i<$num;$i++){
				$this->start();
				$this->stop();
				$sum += $this->row[count($this->row)-6][ex_time];
			}
			return($sum/$num);
		}
	}
?>

使い方

何はともあれ取りあえずファイルを読み込む

include('benchmark.inc');

適当な名前「yome」とかでインスタンス化する

$yome = new joshimane();

あとは解析出来るように対象プログラムをstart()とstop()で囲むだけ

$yome->start(); // 調査スタート
for_with_count($array); // 1つ目の調査したい関数
$yome->setMarker('with'); // 名前をつけて1つ目の調査終了し、2つ目の調査開始
for_without_count($array); // 2つ目の調査したい関数
$yome->setMarker('without'); // 名前をつけて2つ目の調査終了し、3つ目の調査開始
$yome->stop(); // 調査終了
$yome->display(); // 画面出力

marker=>ラベル、time_index=>タイムスタンプ、ex_time=>処理時間[s]、perct=>全体から見た処理時間の割合

bench.png

この表は以下のように、for文内・外どちらで配列数を取得した方がいいか、配列数を2000として比較したもの。

ちなみに「without」の方が3倍速いのは、「with」の方がforを1回実行する毎にcount()で配列数を取得しているから。

with

	function for_with_count($ary){
		for($i=0,$sum=0;$i<count($ary);$i++){
			$sum += $ary[$i];
		}
	}

without

	function for_without_count($ary){
		$count = count($ary);
		for($i=0,$sum=0;$i<$count;$i++) {
			$sum += $ary[$i];
		}
	}

適当に配列を2000個生成

	function generate_random_array($max){
		$ary = array();
		while($max-- > 0){
			$ary[] = rand(1, 655535);
		}
		return($ary);
	}
	$ary = generate_random_array(2000);

あと、平均実行時間も取得できる。

$yome->run(5, 'my_print', 'test'); // run(実行回数, '関数名', '引数')
$yome->display(); // 画面出力
echo "平均実行時間:{$yome->ave()} [s]<br>\n"; // 平均時間取得
bench2.png

平均実行時間:1.0002946376801 [s]

   function my_print($string){
   	print $string."<br>";
   	sleep(1);
   }

あともう一つおまけに、start()とstop()の平均実行時間も取得できる。

これで誤差修正できたらなと作ったものだから、役にたたんかも。

echo "平均実行時間:{$yome->test(1000)} [s]<br>\n"; // test(実行回数)

ステータスコード取得

get_headers()

	// 試行回数:100 [回]
	// 平均実行時間:0.457779619694 [s]
	function state($url){
		
		// 引数がなければ強制終了
		if(!$url) return(-1);
		
		$res = get_headers($url);
		
		// インフォメーション
		if(preg_match("/(1[0-9][0-9])/",$res['0'])){
			return(100);
		// 正常終了
		}else if(preg_match("/(2[0-9][0-9])/",$res['0'])){
			return(200);
		// リダイレクト
		}else if(preg_match("/(3[0-9][0-9])/",$res['0'])){
			return(300);
		// クライアントエラー
		}else if(preg_match("/(4[0-9][0-9])/",$res['0'])){
			return(400);
		// サーバーエラー
		}else if(preg_match("/(5[0-9][0-9])/",$res['0'])){
			return(500);
		// 内部エラー
		}else{
			return(-1);
		}
	}

Curl

	// 試行回数:100 [回]
	// 平均実行時間:0.310024759769 [s]
	function state($url){
		
		// 引数がなければ強制終了
		if(!$url) return(-1);
		
		$ch = curl_init();
		$options = array(
			CURLOPT_URL => $url,
			CURLOPT_HEADER => TRUE,
			CURLOPT_NOBODY => TRUE,
			CURLOPT_RETURNTRANSFER => TRUE,
		);
		curl_setopt_array($ch, $options);
		$header_data = curl_exec($ch);
		curl_close($ch);
		$res = explode("\n", $header_data);
		// インフォメーション
		if(preg_match("/(1[0-9][0-9])/",$res['0'])){
			return(100);
		// 正常終了
		}else if(preg_match("/(2[0-9][0-9])/",$res['0'])){
			return(200);
		// リダイレクト
		}else if(preg_match("/(3[0-9][0-9])/",$res['0'])){
			return(300);
		// クライアントエラー
		}else if(preg_match("/(4[0-9][0-9])/",$res['0'])){
			return(400);
		// サーバーエラー
		}else if(preg_match("/(5[0-9][0-9])/",$res['0'])){
			return(500);
		// 内部エラー
		}else{
			return(-1);
		}
	}

HTMLソース取得

ファイルとして読み込む

	// 試行回数:100 [回]
	// 平均実行時間:0.606519789696 [s]
	function ReadHtml($url){
		$fp = fopen($url, 'r');
		while(!feof($fp)){
			$res=fgets($fp);
			//echo $res;
		}
		fclose($fp);
	}

Curl

	// 試行回数:100 [回]
	// 平均実行時間:0.478241980076 [s]
	function ReadHtml($url){
		$ch = curl_init();
		$options = array(
			CURLOPT_URL => $url,
			CURLOPT_RETURNTRANSFER => TRUE,
		);
		curl_setopt_array($ch, $options);
		$res = curl_exec($ch);
		curl_close($ch);
		$res = explode("\n", $res);
		$count = count($res);
		for($i=0;$i<$count;$i++){
			//echo $res[$i];
		}
	}

連想配列同士の合体

キーが文字の場合

この関数を使うだけ!

array_merge(配列, 配列)

$test1 = array("aaa"=>"111", "bbb"=>"222", "ccc"=>"333");
$test2 = array("ddd"=>"444", "eee"=>"555", "fff"=>"666");
$result = array_merge($test1, $test2);
print_r($test1);

結果

Array
(
   [aaa] => 111
   [bbb] => 222
   [ccc] => 333
   [ddd] => 444
   [eee] => 555
   [fff] => 666
)

キーが数字の場合

問題はこれ!

$test1 = array("23"=>"111", "34"=>"222", "45"=>"333");
$test2 = array("56"=>"444", "67"=>"555", "78"=>"666");
$result = array_merge($test1, $test2);
print_r($result);

同じように使うとキーが数字だとキーが破損する

Array
(
   [0] => 111
   [1] => 222
   [2] => 333
   [3] => 444
   [4] => 555
   [5] => 666
)

なので、キー値を取得して統合

for($i=0,$cnt=count($追加する配列名),$key=array_keys($追加する配列名);$i<$cnt;$i++){
	$追加される配列名[$key[$i]] = $追加する配列名[$key[$i]];
}

メモ書き

html htmlspecialchars("変換文字列", ENT_QUOTES, "文字コード")

データベース htmlentities("変換文字列", ENT_QUOTES, "UTF-8") html_entity_decode("変換文字列", ENT_QUOTES, "UTF-8")

関数の戻り値

function numbers()
{
    return array (0, 1, 2);
}
list ($zero, $one, $two) = numbers();
function numbers()
{
    return array ("zero"=>0, "one"=>1, "two"=>2);
}
$num = numbers();
$num[zero]
$num[one]
$num[two]

$word="欲しい文字列消したい文字列消したい文字列消したい文字列";
$delete_word = strstr("文字列", '消したい文字列');
$word = str_replace($delete_word, '', "文字列");
echo $word;
欲しい文字列
echo $delete_word;
消したい文字列消したい文字列消したい文字列

トランザクション処理

http://redwarcueid.seesaa.net/article/140085587.html

http://webmaster.chielog.com/php/89.html

post/get の生のデータ

  • $_SERVER["QUERY_STRING"] //GET
  • file_get_contents("php://input"); //POST

ペタペタ

$date = time(); $date = "2009-11-11 11:11:11"; date("Y/m/d H:i.s", strtotime($date))

$url = preg_replace("/^url=/", '', $_SERVER['QUERY_STRING']);

タグ解析

HTML

Simple HTML DOM Parserを使えば簡単にタグを取得できる

解凍したファイルの「simple_html_dom.php」を読み込んで利用する

// ファイル読み込み
include("./simple_html_dom.php");

RSS

RSSの場合は関数が用意されているので「simplexml_load_file()」使えばおk

$rssurl = "http://www.tubox.com/blog/category/samplebox/feed/";
$rssdata = simplexml_load_file($rssurl);
print $rssdata->channel->item[0]->title;

配列を利用した一括置換

$str = 'a b c';
$search = array('a', 'b', 'c');
$replace = array('b', 'c', 'd');
echo str_replace($search,$replace,$str); => # b c d

二進数を文字列に変換

<?php
	$str = '010010000110000101110000011100000111100100100000010011100110010101110111001000000101100101100101011000010111001000100001';
	for ( $i = 0; $i < strlen($str) / 8; $i++ ) {
		$currentStr = substr($str, $i * 8, 8);
		echo chr(bindec($currentStr));
	}
?>

添付ファイル: filebench.png 172件 [詳細] filebench2.png 175件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-01-16 (土) 18:03:29 (435d)