CakephpでUnknown status codeのinternal errorが発生した

Cakephpでデータベースの登録処理を作っていたらエラーが発生

cakephp-internal-error

internal-error??
検索したらキャッシュとかデータベースとか言われてました

ログを見ると
$ tail app/tmp/logs/error.log
2014-11-22 06:00:44 Error: [CakeException] Unknown status code
Request URL: /cakephp/comments/add
Stack Trace:
#0 /vagrant/cakephp/lib/Cake/Controller/Controller.php(785): CakeResponse->statusCode(’25’)
#1 /vagrant/cakephp/app/Controller/CommentsController.php(16): Controller->redirect(Array, ’25’)
#2 [internal function]: CommentsController->add()
・・・

リダイレクトでコード25でとぼうとしてる..

間違いはこれでした

$this->redirect(array('controller' => 'posts', 'action' => 'view'), $id);
// カッコの位置を修正して第一引数の配列にdataを入れる
$this->redirect(array('controller' => 'posts', 'action' => 'view', $id));

redirectの第2引数には、HTTPのレスポンスコードが入るようで
やっかいかとおもったらちょっとの違いでした

phpのstrposの挙動を確認する

phpのstrpos関数を動きを確認したのでメモ

strposは

文字列内の部分文字列が最初に現れる場所を見つける

とあります
http://php.net/manual/ja/function.strpos.php

使い方は


echo strpos("abcdefg", "c");
// 2

のように、文字列”abcdefg”のなかに”c”が何番目(0始まり)にあるかを返します
もしなければ、FALSEが返ります

よく間違えやすいのが、文字”a”がなければ..のとき


var_dump(false == strpos($str, 'a'));
// true

というコードです

これはaが0番目にあるため、strposは0を返す
phpでは false == 0 は true になります
== だけだと型をみないので
=== で型も見て比較すると大丈夫です


var_dump(false == 0);
// true

var_dump(false === 0);
// false

strposでは型もみて比較しましょう


// もし文字がなければ
if (false === strpos($str, 'a')) ...

// もし文字があるなら
if (false !== strpos($str, 'a')) ...

// 3項演算子でも===で
$str = (false !== strpos($str, 'a') ? 'ある' : 'ない';

3項演算子のときにうっかりしそうです

hetemlでデータベースのバックアップを自動で取る

以前紹介した
bashスクリプトでデータベースをバックアップする
のコードをhetemlのサーバーにあげて、cronで回すとエラーが

調べてみると..
hetemlのよくあるお問い合わせに
http://heteml.jp/support/faq/2085.html

Q.cronで rm や wget 、find コマンドは使えますか?
A.cronでは rm や wget 、find コマンドはご利用いただけません。

rmが使えない..
困ったということでphpでバックアップを取ろうと、以前の記事
phpでデータベースのバックアップをとる
でやりました

そのままのコードだと
ログインルートにファイルが保存される、
hetemlのmysqlデータベースは別サーバー,
なので、ちょっと修正


#!/usr/bin/php
<?php

$date = new DateTime();
$today = $date->format("Y-m-d");

$date->sub(new DateInterval("P11D"));
$deleteDate = $date->format("Y-m-d");

$backupFolder = "backup/database/";
$backupFile = $today . ".dbbackup";
$deleteFile = $deleteDate . ".dbbackup";

system("mysqldump -u (user name) -h (database server address) --password=(password) (database name) > {$backupFolder}{$backupFile}");

if (file_exists($backupFolder.$deleteFile)) {
    unlink($backupFolder.$deleteFile);
}

backup.phpなどとファイルに保存、sftpかsshを有効にしてscpでサーバーにあげます
権限は700になるようにしました

sftpかsshでログインして、
backup/database
というディレクトリをサーバーへ作っておきます

あとはcron設定をして、バックアップが取れてれば成功です
cronのエラーはメールアドレスをcron設定の画面で登録すると、飛んできます
参考) heteml cron設定マニュアル

いまのところWEBサーバーにバックアップを保存してます
今後、違うサーバーへ保存しようと思います



phpでデータベースのバックアップをとる

以前、
bashスクリプトでデータベースをバックアップする
でbashスクリプトでのバックアップを取りました

phpでどうとるかやってみます

phpスクリプトはこんな感じです


#!/usr/bin/php
<?php
$date = new DateTime();
$today = $date->format("Y-m-d");

$date->sub(new DateInterval("P11D"));
$deleteDate = $date->format("Y-m-d");

$backupFile = $today . ".dbbackup";
$deleteFile = $deleteDate . ".dbbackup";

system("mysqldump -u (user name) --password=(password) (database name) > {$backupFile}");

if (file_exists($deleteFile)) {
    unlink($deleteFile);
}

sysytemでmysqldumpを実行して、11日前のバックアップをunlinkで消しています

これをbackup.phpとかに保存して実行権限をつけます
$ chmod u+x backup.php
とかです

実行してバックアップがとれてれば成功です
$ ./backup.php

cronに登録すれば自動バックアップの完成です