プロが教えるわが家の防犯対策術!

さくらのVPSにCakePHPを導入して試しています。

VPSの設定が一通り完了し、現行のサイト(さくらのレンタルサーバーに設置)を移行してみたところ、どうしてもうまくいきません。

html+phpのページは何の問題もなく表示されるため、データベース(Mysql)が原因なのは明らかなのですが、スキル不足の問題もあり問題が見つけられず困っています。

具体的には、Mysqlにアクセスするページを表示しようとすると、このようなエラーがCakePHPのログに残ります。
------
Error: Fatal Error (1): Allowed memory size of 134217728 bytes exhausted (tried to allocate 17218517 bytes) in [/var/cake/lib/Cake/Utility/String.php, line 247]
2013-07-13 09:43:45 Error: [FatalErrorException] Allowed memory size of 134217728 bytes exhausted (tried to allocate 17218517 bytes)
#0 /var/cake/lib/Cake/Error/ErrorHandler.php(161): ErrorHandler::handleFatalError(1, 'Allowed memory ...', '/var/cake/lib/C...', 247)
#1 [internal function]: ErrorHandler::handleError(1, 'Allowed memory ...', '/var/cake/lib/C...', 247, Array)
#2 /var/cake/lib/Cake/Core/App.php(926): call_user_func('ErrorHandler::h...', 1, 'Allowed memory ...', '/var/cake/lib/C...', 247, Array)
#3 /var/cake/lib/Cake/Core/App.php(899): App::_checkFatalError()
#4 [internal function]: App::shutdown()
#5 {main}
------
メモリーサイズを上げると、今度はタイムアウトでエラーになります。


CakePHPの「database.php」には、
public $default = array(
'datasource' => 'Database/Mysql',
'persistent' => false,
'host' => 'localhost',
'login' => 'hoge',
'password' => 'pass',
'database' => 'hoge',
'prefix' => '',
'encoding' => 'utf8',
);
と設定していて、Mysqlにはユーザー「hoge」とテーブル「hoge」を用意しています。

たとえば、上の設定で「database」を存在しないテーブル「aaa」にすると、
Missing Database Connection
Error: A Database connection using "Mysql" was missing or unable to connect.
The database server returned this error: SQLSTATE[28000] [1045] Access denied for user 'aaa'@'localhost' (using password: YES)
このように普通のエラーが表示されます。

また、「login」を存在しないユーザー名「bbb」にすると、
Missing Database Connection
Error: A Database connection using "Mysql" was missing or unable to connect.
The database server returned this error: SQLSTATE[42000] [1049] Unknown database 'bbb'
こちらも普通のエラーが表示されます。

CakePHPのappディレクトリはvar直下に移動していますが、html直下に置いても結果は同じでした。


どういったことが原因なのか、解決方法や手がかりなどご教示いただければと思います。

-------------
さくらのVPS SSD 2G
CentOS 6 x86_64

PHPのバージョン
PHP 5.3.3 (cli) (built: Feb 22 2013 02:51:11)

Mysqlのバージョン
Ver 14.14 Distrib 5.1.69, for redhat-linux-gnu (x86_64) using readline 5.1

PDO
PDO support => enabled
PDO drivers => mysql, sqlite
PDO Driver for MySQL, client library version => 5.1.69
PDO Driver for SQLite 3.x => enabled
-------------

A 回答 (6件)

うーん、成功コードがちゃんと入っているようで、私の方でできるアドバイスも行き詰まりました。



「PDOもmysqlも正しく動作していて関数も成功判定されているのにデータがとれていない」状況というのは、単純に「そのテーブルのデータがない」以外には遭遇したことないんですよね。

再度、各種ログファイル(httpd、php、mysql、syslog、audit)を確認して戴いて何も無いようならお手上げです。
    • good
    • 0
この回答へのお礼

お世話になります。

その後もいろいろ試しましたが、どうしてもダメでした。
OSを入れ直すなどして、うまく行くまで何度もトライしてみます。
長い間おつきあいくださいまして、誠にありがとうございました。
とてもよい勉強になりました。

お礼日時:2013/07/15 20:23

PDOのインスタンスは作成されているようなので接続には成功してるような感じですね。



サンプルのphp部分を次のように書き換えることでエラー内容が取れるかもしれないので試して戴けませんか?
------------------------------
try {
$dbh = new PDO('mysql:host=localhost;dbname=hoge;', 'user', 'pass');

$sth = $dbh->prepare('SELECT * FROM table');
print_r($dbh->errorInfo());

$sth->execute();
print_r($sth->errorInfo());

}catch(PDOException $e){
var_dump($e->getMessage());
}
------------------------------

なんとなく、PDOが問題というか、phpからアクセスしようとしているデータにアクセスできていない感じを受けます。
(ユーザーの表に対する権限が足りないか、空間が別。テーブル自体がない、テーブルの中のデータがない、など)

#手元に環境なくコメントをしているので、色々遠回りで申し訳ないです。

この回答への補足

お世話になります。

いただいたサンプルを実行したところ、以下のメッセージが表示されました。
/usr/lib64/php/modulesArray ( [0] => 00000 [1] => [2] => ) Array ( [0] => 00000 [1] => [2] => )

> 手元に環境なくコメントをしているので、色々遠回りで申し訳ないです。
とんでもないです。こんな初心者に貴重なお時間を割いていただき大変感謝しております。

こちらの環境を見ていただいたら即座に修復可能な内容とだと思うのですが、なかなか状況を的確に伝えられず、何度もお手数をおけして申し訳ありません。

補足日時:2013/07/14 20:55
    • good
    • 0

変ですね、書いたコードが真っ白になる場合はPHPのログに何かしらエラー内容がでてるはずなんですが、何も出なかったですか?



・phpのログをとってない場合は一時的にphp.iniを編集していただけますか(要httpd再起動)。
--------------------------------
error_reporting = E_ALL
log_errors = On
error_log = ログのパス
--------------------------------

それでもログに何も出力されない場合

・charsetの指定をなくしても真っ白になりますか?
--------------------------------
//$dbh = new PDO('mysql:host=localhost;dbname=hoge;charset=UTF-8', 'user', 'pass');
                 ↓
$dbh = new PDO('mysql:host=localhost;dbname=hoge;', 'user', 'pass');
--------------------------------

・$dbhに何か情報が入ってきていますか?
(確認される時はブラウザのソースコードを表示してください)
--------------------------------
$dbh = new PDO('mysql:host=localhost;dbname=hoge;charset=UTF-8', 'user', 'pass');
var_dump($dbh); // <--- ここに追加
--------------------------------

$dbhに何も入ってない場合はphp->PDO間の問題(soをロードできていないとか)、
何かしら情報が表示された場合はphp->mysql間の通信(の設定)の問題じゃないかなと推測できます。


あと、覚えておられたらでいいので、システムにphpを入れたときのコマンドを教えて戴けますか。

この回答への補足

お世話になります。

ログは設定してあります。
ログには以下の2つが記録されていましたが、修正したあとは何も出力されていません。
■PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/pdo_sqlite.so' - /usr/lib64/php/modules/pdo_sqlite.so: undefined symbol: php_pdo_register_driver in Unknown on line 0
■PHP Warning: Module 'pdo_mysql' already loaded in Unknown on line 0

ほかのログも確認しているのですが、どれも把握できるものなので今回の件に直接関わるものではないようです。

new PDO中のcharsetの指定を外してみましたが、真っ白のまま変わりませんでした。
var_dump($dbh);を追加すると、
object(PDO)#1 (0) { }
これが表示されます。

PHPをインストールしたときのコマンドは以下のものです。
yum -y install php php-mbstring php-mysql php-gd


この感じだと設定1つで解決できそうな予感がするのですが、初心者にはそれを見つけるのが難しいですね。

いろいろいじってはいますが、設定は1つ変えてダメなら元に戻すという作業を繰り返しているので、ぐちゃぐちゃにはなっていないと思います。

補足日時:2013/07/14 16:10
    • good
    • 0

そうしますと、原因を切り分けて考えて行かないと難しいかも知れません。



・cakeなしでphpからmysqlのデータを引けるかどうか。(例えば次のようなコードが動くかどうか)
------------------------------
<html><head><title>test</title></head><body>
<?php

try {
$dbh = new PDO('mysql:host=localhost;dbname=hoge;charset=UTF-8', 'user', 'pass');

foreach($dbh->query('SELECT * FROM table') as $row){
echo implode('', $row) . '<br/>';
}
}catch(PDOException $e){
var_dump($e->getMessage());
}
?>
</body></html>
------------------------------

・(おそらくrelease用の設定をされていると思いますので)表示されないエラーが出ていないかどうか。
http://inspire-tech.jp/2011/10/cakephp_error_log …

・そもそもmysql monitor, php myadminなどのツールからmysqldに接続できるかどうか。

・SELinuxが何かを弾いていないかどうか。

などなど・・・

この回答への補足

お世話になります。

お忙しいところ、サンプルのご呈示までしていただきありがとうございます。

早速、ユーザー名やパスワードを入れて試してみたところ、CakePHPのときと同じようにエラーは表示されず、真っ白な画面になってしまいました。

ユーザー名を存在しないものにすると、以下のようなエラーは表示されます。
string(86) "SQLSTATE[28000] [1045] Access denied for user 'aaaa'@'localhost' (using password: YES)"
データベース名でも同様です。

新たにデータベースを追加したりしてあれこれ試してみましたが、結果は同じでページは真っ白になってしまいます。


エラー表示設定ですが、テストサイトは.htaccessで制限しているので、CakePHPのデバッグレベルは2にしたままで試しています。

phpmyadminは普通に使うことができます。ツール上でのデータ変更も可能です。

セキュリティ関係の設定は動作後に行う予定でしたので、SELinuxはDisabledになっています。

自分のほうでも思いついたことをいろいろと試しているのですが、未だ原因がさっぱりわかりません。

補足日時:2013/07/13 21:31
    • good
    • 0
この回答へのお礼

試しに以下のプログラムにしてみたところ、下の結果が表示されました。ですので、PDOのところがうまくいってないようです。

$url = "localhost";
$user = "hoge";
$pass = "****";
$db = "hoge";

$link = mysql_connect($url,$user,$pass) or die("MySQLへの接続に失敗しました。");
$sdb = mysql_select_db($db,$link) or die("データベースの選択に失敗しました。");
$sql = "SELECT * FROM qqq";
$result = mysql_query($sql, $link) or die("クエリの送信に失敗しました。<br />SQL:".$sql);

$rows = mysql_num_rows($result);

mysql_free_result($result);

mysql_close($link) or die("MySQL切断に失敗しました。");

echo "
接続ID:{$link}<br />
選択の成否:{$sdb}<br />
結果ID:{$result}<br />
行数:{$rows}<br />";

---結果---
接続ID:Resource id #2
選択の成否:1
結果ID:Resource id #3
行数:2
--------

お礼日時:2013/07/14 07:35

http://pentan.info/php/30timeout.html

上の記事を見ていただいて、いったんタイムアウトを3600秒等に設定するとどうなりますか?
重くても動くようなら単純にSQL文か処理が重いだけだと思います。

あと、mysqld側のログも見てみたほうがいいと思います。

参考URL:http://server-setting.info/centos/mysql-log-type …

この回答への補足

お世話になります。
タイムアウトの時間を延ばすと、今度は再びメモリー不足になるという状態です。結局処理はできず、無限ループのような状態です。

Mysqlを使ったページを開くと、最初のhtml部分は表示され、データベース情報を出力するところでUndefined index~となってしまいます。Mysql関連のエラーメッセージが表示されないので、手がかりがありません。

何らかの設定ミスだと思うのですが、どうやってその間違いを見つけられるのか、ここ2日間ずっと悩み続けています。

Mysqlのエラーログも確認しましたが、とくに出力されていません。

そのほかのエラーとして
PHP Warning: Module 'pdo_mysql' already loaded in Unknown on line 0
があったのでphp.iniを修正したところ、それ以降ログは残らなくなりました。

また、SQL文が重いのではというご指摘ですが、SQL文が少ないページでも同様に動作をしてくれません。さくらのレンタルサーバーで普通に動作しているので、おそらくSQL文に問題はないと思います。

補足日時:2013/07/13 17:58
    • good
    • 0

メモリサイズをあげた後に出るタイムアウトのエラー内容を書いて貰えないですか?



何がタイムアウトしているのかが分かりません。

この回答への補足

お世話になります。
リミットを1024Mにすると、このようなエラーになります。

Error: Fatal Error (1): Maximum execution time of 30 seconds exceeded in [/var/cake/lib/Cake/basics.php, line 192]
2013-07-13 12:48:06 Error: [FatalErrorException] Maximum execution time of 30 seconds exceeded
#0 /var/cake/lib/Cake/Error/ErrorHandler.php(161): ErrorHandler::handleFatalError(1, 'Maximum executi...', '/var/cake/lib/C...', 192)
#1 [internal function]: ErrorHandler::handleError(1, 'Maximum executi...', '/var/cake/lib/C...', 192, Array)
#2 /var/cake/lib/Cake/Core/App.php(926): call_user_func('ErrorHandler::h...', 1, 'Maximum executi...', '/var/cake/lib/C...', 192, Array)
#3 /var/cake/lib/Cake/Core/App.php(899): App::_checkFatalError()
#4 [internal function]: App::shutdown()
#5 {main}

補足日時:2013/07/13 12:52
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!