PHP


さくらサーバーでpearのインストール 2016年10月版

さくらのレンタルサーバーをプラン変更した際、 pear の再設定に手間取ったので覚書。
php ファイル で、DB ライブラリとPager ライブラリを利用しているため、それぞれを利用可能にする必要があった。さくらのレンタルサーバーには、もともと pear がインストールされているが件のライブラリ は入っていない。もともと入っている pear は共有部分のに入っているため、ライブラリをインストールするには、 pear 自体も ローカル部分にインストール必要があった。

1.さくらサーバーに pear のインストール

pear のインストール方法はいくつかあるが、今回は go-pear を使った。
go-pear は古くてインストール途中で止まるものがインターネット上にたくさんある。

2016年10月3日現在有効な pear-go

上記リンクを右クリックして www フォルダ以下に「go-pear.php」という名前で保存。その後、ブラウザからアクセスする。

設定項目を埋めて、インストールボタンを押す。設定項目のインストール先は www フォルダ(Installation prefix($prefix))直下がデフォルトのようだが、移行元の pear が「/home/ユーザー名/」の直下だったので、同じようにした。

設定の参考にしたページ こちら

インストールは無事完了したが、Warning が出た。

----------------------------------------------
Warning: Can not determine the URL of the freshly installed Web Frontend
(file: /home/ユーザー名/index.php).
Please access it manually !
----------------------------------------------

これは「インストール後に生成された index.php ファイルが www フォルダより上にあるためアクセスできないよ」という内容のもの。ブラウザからライブラリをインストールするには、index.php へのアクセスが必要なので、www フォルダ直下に「gopear」というフォルダを作って、index.php ファイルをコピーした。

2.ライブラリのインストール

ライブラリをインストールするにはターミナルから操作する方法と 件の index.php へアクセスして操作する方法がある。

最初ターミナルからサーバーにログインしてコマンドを実施した

//DB ライブラリをインストールするコマンド
------------------------
% pear install -a DB
------------------------

インストールできたかは list でパッケージの一覧を取得すればいい
------------------------
% pear -c /home/acount_name/pear.conf list
------------------------
※pear.conf info のところが .pearrc になっている場合があるかも?find /home/acount_name -name '*pear*' で対象のファイルがあるか確認するといい。
※ -c file の詳細は pear help options で確認できる

これだとさくらサーバーに最初からある pear の情報が出る
------------------------
% pear list
------------------------

すると、エラーが出てインストールできなかった

//エラー内容
------------------------
Cannot install, php_dir for channel "pear.php.net" is not writeable by the current user
------------------------

書き込みができないという内容。どうもインストールを実施しようとしている pear が、さくらサーバーにもともとインストールされている pear らしい。

//pear のバージョンを調べるとどの pear に対して命令しているのか分かる
------------------------
% pear info PEAR
------------------------

自前のpearならこれ
------------------------
% pear -c /home/acount_name/pear.conf info PEAR
------------------------

自分でインストールした pear に対して命令してもいいが、index.php からライブラリをインストールする方法に変更。

pear インストール時に生成された index.php にブラウザからアクセス。
画面の右上にある「Search package by name」から、DB と Pager を検索してインストール。
DB と名前の入るライブラリがたくさんあって、検索結果が出るまで時間がかかった。読み込み中がずっと続いたのであせった。

インストールできたら、ドキュメントルートの php.ini を変更してpear を include して使う。

【PHP】DreamHostでmysqlの接続

DreamHostでPHPを使ってmysqlデータベースへ接続する方法のメモ。

//mysqlの接続
///////////////////////////////////////////////
$hostname = ""; // mysql.example.com (「mysql.」 + 「独自ドメイン」)
$username = ""; // データベースを設定したときに決めたユーザ名
$password = ""; // データベースを設定したときに決めたパスワード
$database = ""; // 接続するデータベース名

$link = mysql_connect($hostname,$username,$password);
mysql_select_db($database) or die("Unable to select database");
mysql_query('SET NAMES utf8', $link); //←文字化け対策
//mysql_set_charset('utf8'); //←もしくはこれ
///////////////////////////////////////////////

//出力の例
///////////////////////////////////////////////
$sql = "SELECT * FROM table_name";

$result = mysql_query($sql,$link) or die("Unable to select: ".mysql_error());

while($datas = mysql_fetch_assoc($result)) {

echo $datas['column_name'] . "
";

}
///////////////////////////////////////////////

//mysqlの切断
///////////////////////////////////////////////
mysql_close($link);
///////////////////////////////////////////////

さくらにて、異なるドメイン間でリダイレクトする

さくらインターネットにて .htaccess 内に RewriteRule を記述してリダイレクトを指定したがうまくいかなかった。どうもドメインをまたいでのURL遷移は禁止されているらしい。

・さくらインターネットで、RewriteRule を用いて異なるドメイン間のリダイレクトは不可。

php を使ってのリダイレクトは問題なく出来た。

---------------------------------
<?php
header( "HTTP/1.1 301 Moved Permanently" );
header( "Location: http://$new_url" );
?>
---------------------------------

【PHP】expects parameter 1 to be resource, boolean givenの意味

PHPにてmysql_fetch_assocを実行したところエラーが出た

エラー内容
-------------------------------------------------------
Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in /home/username/www/test.php on line 183
-------------------------------------------------------

日本語訳
-------------------------------------------------------
「mysql_fetch_assoc()」は、パラメータ1がリソース型(データベース操作をして取り出した値)であると期待したが、boolean値(falseのこと)が与えられた。test.phpの183行目において。
-------------------------------------------------------

ようは、queryの実行に失敗していて、データベースの値は取り出せず、falseになっているということ。

・リソース →ファイル接続、データベース接続 などを通して使用する PHP 外の情報資源。

・expect A to do ~ → Aが~するのを期待する。

【PHP】正規表現の後方参照の直後に数字が来る場合の記述

preg_replaceなどで使う後方参照について。
たとえば、後方参照「$1」の後に数字の「100」がくる場合、次のように記述すればいい。

----------------------------------
${1}100
----------------------------------

【PHP】file_get_contentsでユーザーエージェントを指定する

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);

参考ページ:こちら

2014年版 さくらでpearインストール(go-pear.phar使用)

さくらインターネットで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
------------------------------------

【MYSQL+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 "ロールバックしました";

}
///////////////////////////////////////////////////////////////

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の正規表現を実行するとApacheが落ちる

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が落ちる問題も解消された。

参考にしたページ
こちらこちら

2 / 512345