PHP


【さくら】php-mecabが突然使用できなくなった件

php-mecab を使用してるページがエラーしか表示されなくなった。

表示されたエラー
---------------------------------------------------
Fatal error: Class 'Mecab' not found in /home/username/www/xxxx.html on line 20
---------------------------------------------------

推測だが、さくらインターネットの PHP のバージョンが勝手に変更されたのが原因だと思う。phpinfo で mecab が表示されない。つまり、php-mecab が認識されていない。

解決用法、mecab および php-mecab を入れ直した。

入れ直し時に注意すること。

・mecab と php-mecab の古いファイルは念のため削除しておく。上書きされるかと思ったがうまくいかなかった。(これがうまくいかない原因だったかは不明)

・php-mecab のインストール時に php のバージョンを指定する箇所があるので新しいバージョンに合わせる。

・さくらにデフォルトインストールの mecab に問題があった場合解決が難しいので、自前の mecab を local 領域にいれて使用したほうが解決しやすい。(今回、デフォルト → 自前 に変更した)

さくらサーバーで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にする。

2 / 512345