PHP
file_get_contentsでユーザーエージェントを指定する方法のおぼえ書き。
ユーザーエージェントで表示内容を振り分けるページに有効。
//この設定がなければ、UserAgentは「PHP/x.x.x」になる。
////////////////////////////////////////////////////////////////////////////
$context = stream_context_create(array('http' => array(
'method' => 'GET',
'header' => 'User-Agent: Mozilla/6.4 (compatible; MSIE 4.0; Windows 98; DigExt)',
)));
////////////////////////////////////////////////////////////////////////////
file_get_contents($url, false,$context);
参考ページ:こちら
カテゴリー:PHP
さくらインターネットでpearをインストールしたときの覚書。
go-pearを使ったが、ファイルが古いのか利用中のさくらサーバーではインストールできず。(途中で止まる)。
2014年4月現在、下記の方法でpearがインストールできる。
1.ターミナルでサーバーにインストールして、go-pear.pharをダウンロード。
------------------------------------
curl http://pear.php.net/go-pear.phar > go-pear.phar
------------------------------------
このとき、ダウンロード先はここにした。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/home/ユーザー名
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2.次のコマンドを実行してインストール開始。
------------------------------------
php go-pear.phar
------------------------------------
インストール先を「/home/ユーザー名/pear」にしたかったので、事前に「pear」フォルダを作っておいた。「/home/ユーザー名」にある「go-pear.phar」を実行すれば、希望のフォルダにインストールされた。
インストール途中でメッセージが出た。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Would you like to alter php.ini ? [Y/n] :
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
権限がなくて変更できないので「n」を選択。
以上でインストールは完了。
参考ページ: こちら
以下はおまけの覚書。
3.DB.phpが使いたかったので、コマンドを実行してインストール。
------------------------------------
pear install DB
------------------------------------
4.使いやすくするためにDB.phpのある場所にパスを通す。
php.iniに追記した内容
------------------------------------
/home/ユーザー名/pear/share/pear
------------------------------------
また、PHPファイルでデータベースを読み込んだときエラーが出たが、単にログインパスワードを間違えていただけだった・・・
ブラウザに出力されたエラー内容
------------------------------------
Warning: mysql_set_charset(): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) in /home/ユーザー名/libs/function.php on line 220
Warning: mysql_set_charset(): A link to the server could not be established in /home/ユーザー名/libs/function.php on line 220
ConnectError!DB Error: connect failed
------------------------------------
カテゴリー:PHP, さくらインターネット
MYSQL + PHPでトランザクションを行うための記述例
トランザクションのサンプルコード
///////////////////////////////////////////////////////////////
//通常は、自動コミットが有効になっているのでクエリ入力後、すぐにコミット(データベースの更新処理)が行われる。
//トランザクション処理を行うため「SET AUTOCOMMIT=0」で自動コミットを無効する。
mysql_query("SET AUTOCOMMIT = 0"); //オートコミットを無効にする
mysql_query("begin"); //トランザクション開始
//----この間に複数の処理を記述----------------------------------
$sql1 = "UPDATE テーブル名1 WHERE ~; //処理1
mysql_query($up_sql1) OR die(mysql_error());
$sql2 = "DELETE FROM テーブル名2 WHERE ~" //処理2
mysql_query($up_sql2) OR die(mysql_error());
//----この間に複数の処理を記述 ここまで-------------------------
mysql_query("commit"); //ここで上記二つの処理が同時に実行される
///////////////////////////////////////////////////////////////
//commitがないので絶対にテーブルは更新されないサンプルコード
///////////////////////////////////////////////////////////////
mysql_query("SET AUTOCOMMIT = 0");
mysql_query("begin"); //トランザクション開始
$sql1 = "UPDATE テーブル名1 WHERE ~; //処理1
mysql_query($up_sql1) OR die(mysql_error());
$sql2 = "DELETE FROM テーブル名2 WHERE ~" //処理2
mysql_query($up_sql2) OR die(mysql_error());
mysql_query("rollback"); //ロールバックなので実行されない
///////////////////////////////////////////////////////////////
※仮にロールバックがなくても、コミットせずに接続を閉じても、MySQLはそのトランザクションをロールバックするよう。
コミットとロールバックを細かく振り分けるなら、次のような記述ができる。
コミットとロールバックを振り分けるサンプルコード
///////////////////////////////////////////////////////////////
$sql1 = "UPDATE テーブル名1 WHERE ~; //処理
$result = mysql_query($sql1);
if( $result === true ){
mysql_query("commit"); //確定
print "コミットしました";
}else{
mysql_query("rollback"); //巻き戻し
print "ロールバックしました";
}
///////////////////////////////////////////////////////////////
カテゴリー:mysql, PHP
PHPで進行状況をその都度出力したかったので、テストコードを書いた。
毎秒カウントアップ表示するサンプルコード
------------------------------------------
<?php
for ($i = 0; $i < 10; $i++) {
echo $i;
sleep(1);
}
?>
------------------------------------------
これで1秒ごとにカウントして経過時間が表示されるはず。
そう思ったがうまくいかない。
調べてみると、PHPは出力のバッファリングがオンになっていることが多く、先ほどのようなスクリプトを実行しても毎秒ごとに出力してくれないらしい。
その都度出力は行われず、 代わりに内部バッファに保存される。そして後でまとめて表示される。ループのたびに出力するには「ob_end_flush()」でバッファリングをオフにすればいい。
先ほどのコードを修正
------------------------------------------
<?php
echo str_pad('',4096)."\n"; //←空文字を送る
ob_end_flush(); //バッファリングをオフ
for ($i = 0; $i < 10; $i++) {
echo $i;
flush(); // ← フラッシュする
sleep(1);
}
?>
------------------------------------------
テスト表示のとき意外と重要なのが「str_pad('',4096)」の部分。
多くのブラウザは、ある程度の文字列をバッファしてから表示を開始するため、ob_flush() や flush() によって、出力バッファをフラッシュしても、ブラウザのバッファに蓄積されてしまい、表示されない。
そこで、空白文字列をあらかじめ送るで、この問題を回避している。
これでもうまくいかないときは、PHP以外の何かがバッファリングを行っている疑いがある。
打開策のひとつとして、.htaccessに次の記述をする
------------------------------------------
mod_gzip_on Off
------------------------------------------
レンタルサーバ等の設定によっては、HTTPの応答がmod_gzipにより圧縮されることがあるのでOFFにする。
カテゴリー:PHP
windows7 64bitにインストールしたxamppのPHPにて。
特定のページを読み込もうとするとと読み込み途中で「ページが見つかりません」エラーが出る現象に遭遇。
xamppのコントロールパネルからapacheのエラーログを見る。
エラーメッセージ
----------------------------------------------
ri Feb 07 02:21:38.898457 2014] [mpm_winnt:notice] [pid 3540:tid 248] AH00428: Parent: child process 10068 exited with status 3221225725 -- Restarting.
----------------------------------------------
よくわからないが再起動している。
原因を探っていくとPHPのpreg_match_all()の実行時に問題が起こっているようで、この問題はApacheのスタックサイズが足りなくなるのが発端のよう。
スタックメモリーとは、
----------------------------------------------
そのタスクや関数内だけで使われる変数やアドレス情報なんかを置いておくためのメモリ領域だ。タスクを終了する、または関数から抜けると、スタックの内容も破棄される。
----------------------------------------------
らしい。こちらより
で、このスタックサイズを増やすには、editbinコマンドを実行すればよくて、ただ実行するにはVisual Studioに入っているeditbin.exe(Microsoft COFF Binary File Editor)が必要とのこと。
「Visual Studio Express 2012 for Windows Desktop」をダウンロード。こちら
(最新版はVisual Studio2013だったが、マイクロソフトのアカウントを作ってサインインしろと、面倒くさそうだったので手間のない前ののバージョンにした)
インストールして目的のツールを確認
editbin.exeがあるフォルダのパス
----------------------------------------------
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin
----------------------------------------------
まず、現状のメモリサイズを確認する。
xamppのapacheフォルダ内にあるhttpd.exeをeditbin.exeのあるフォルダにいれる。cdでその場所まで移動してコマンドを実行。
----------------------------------------------
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin>dumpbin /headers httpd.exe
----------------------------------------------
エラーが出た。
----------------------------------------------
コンピューターにmspdb110.dllがないため、プログラムを開始できません
----------------------------------------------
環境変数を反映させればなくなるエラーらしく、同じフォルダにある「vcvars32.bat」を実行。
----------------------------------------------
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin>vcvars32.bat
----------------------------------------------
その後先ほどのコマンドを再び実行。
----------------------------------------------
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin>dumpbin /headers httpd.exe
----------------------------------------------
たくさん表示される情報の中、
「OPTIONAL HEADER VALUES」の見出し中に該当の項目を発見
「40000 size of stack reserve」
「40000」は16進法であり、10進数にすると262144 (256×1024) → 256k
根拠はないが、4倍に増やせば十分かと「1048576」と指定してeditbinを実行。
(式: 目的のメモリ数(単位はKbyte)×1024。今回は1024×1024。)
----------------------------------------------
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin>editbin /stack:1048576 httpd.exe
----------------------------------------------
エラーがでる。
----------------------------------------------
LINK : fatal error LNK1104: ファイル 'httpd.exe' を開くことができません。
----------------------------------------------
どうも権限の都合でフォルダ内のファイルは変更できないらしい。
httpd.exeをデスクトップに移動させて再び実行する。
----------------------------------------------
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin>editbin /stack:1048576 C:\Users\PC名\Desktop\httpd.exe
----------------------------------------------
エラーは出ず。「dumpbin」でサイズ変更されていることを確認。
----------------------------------------------
100000 size of stack reserve
----------------------------------------------
PHPでApacheが落ちる問題も解消された。
参考にしたページ
こちらとこちら
カテゴリー:PHP, xampp
WindowsにインストールしたxamppのphpをUTF-8化時のメモ。
2014年2月3日現在の最新版で行った。
1.「C:\xampp\php」にあるphp.iniを開く
下記の箇所を見つけて、コメントアウトをはずしていく。
----------------------------------------------
;mbstring.language = Japanese
;mbstring.internal_encoding = EUC-JP
;mbstring.http_input = auto
;mbstring.http_output = SJIS
;mbstring.encoding_translation = Off
;mbstring.detect_order = auto
;mbstring.substitute_character = none
;mbstring.func_overload = 0
----------------------------------------------
2.さらに、該当箇所は値を変更する
変更箇所と値
----------------------------------------------
mbstring.internal_encoding = UTF-8
mbstring.http_output = UTF-8
mbstring.encoding_translation = On
----------------------------------------------
カテゴリー:PHP
XAMPPでFFFTPを使うには、FTPユーザーの登録が必要。
ユーザー登録は、FTPサーバーであるFileZillaをXAMPPのコントロールパネルから起動して行う。
設定したIDとPASSを利用して、FFFTPを設定すればいい。
また、FileZillaで作ったユーザーには、書き込み・読み込み等の権限を同時に与えておくこと。
設定をしないとアップロードすらできない。
カテゴリー:PHP
連続した改行を一つにまとめる正規表現のサンプルコード
------------------------------------------
preg_replace('/(\n)+/us','$1',$contents);
------------------------------------------
もっと確実なの
------------------------------------------
preg_replace('/(\n|\r|\r\n)+/us',"\n",$contents);
------------------------------------------
"\n" の部分を ''(シングルクォーテーション)で囲むと \n の部分がそのまま表示され改行にならないので注意。
カテゴリー:PHP, 正規表現
htmlタグ間の文字列を取得するには正規表現を利用する
例:divタグ間の文字列を取得するサンプルコード
--------------------------------------------
preg_replace('/^.+<div>(.+?)<\/div>.+$/u','$1',$string)
--------------------------------------------
しかしこのやり方が通用するのは、限られた条件のときでしかない。
同じ要素のタグが入れ子になっている場合、不可能である。
divタグが入れ子になったHTML。これだとダメ
--------------------------------------------
<body>
<div>
テスト文章1
<div>
テスト文章2
<div>テスト文章3</div>
</div>
</div>
</body>
--------------------------------------------
何とか正規表現でできないものかと悩んだが難しそうなので、別の方法を用いた。
対になるタグというのは言い換えれば、二番目以降の開始タグと、そのひとつ前の閉じタグの位置を比較したとき、閉じタグが手前で、開始タグが奥にある状態の閉じタグである。
対のタグを見つけるサンプルコード
--------------------------------------------
//二番目の開始タグと最初の閉じタグの位置を確認する
$start_pos = mb_stripos($content_html,"<div",6); //二番目の開始タグを見つけたいので適当に6文字目から検索
$end_pos = mb_stripos($content_html,"</div>");
echo "<br>開始位置: " . $start_pos;
echo "<br>終了位置: " . $end_pos;
$i = 1;
//閉じタグが開始タグの前に来るまで繰り返し
while ($start_pos < $end_pos) {
$start_pos++; //次のタグを探すために1増加
$end_pos++;
//前回の位置以降のタグを探す
$start_pos = mb_stripos($content_html,"<div",$start_pos);
$end_pos = mb_stripos($content_html,"</div>",$end_pos);
//念のため10回繰り返してだめなら抜ける
if ($i > 10) {
echo "10回超えたので終える";
break;
}
$i++;
} //while
//対になるタグまでの文字列を抜き出す
$content_html = mb_substr($content_html,0,$end_pos);
--------------------------------------------
カテゴリー:PHP
シンプルにタグの間の文字を抜き出すサンプルコード
abcタグの間の文字を出力
----------------------------------------
<?php
//「$string = <<<XML」の下に改行は入れないこと!エラーになる
//行の先頭に半角スペースなどが入ることもないように(これコピペするとたぶん入る)
$string = <<<XML
<?xml version="1.0" ?>
<root>
<test>TEST1</test>
<test>TEST2</test>
<abc>xyz</abc>
</root>
XML;
$xml = simplexml_load_string($string);
//「->」(アロー演算子)で階層を下っていく
$content = $xml->abc;
print $content;
?>
----------------------------------------
testタグの間の文字を出力する
----------------------------------------
$content = $xml->test;
print $content;
----------------------------------------
但しこれだと最初のひとつしか出力されないので、すべて表示するには展開する。
----------------------------------------
foreach ($xml->test as $value) {
echo $value . "<br>";
}
----------------------------------------
カテゴリー:PHP