Category Archives: php

[Memo]wordpressで「現在メンテナンス中のため、しばらくの間ご利用いただけません。」

1
Filed under php, wordpress
Tagged as , ,

久しぶりのブログ更新が、比較的どうでもいいネタで、
かつwordpressなんで、少し微妙ではありますが、メモ程度に。

wordpressの更新(いわゆるバージョンアップ)をしてみたら、
ブログページも、管理ページも以下のエラーが表示されて、何もできなくなったというお話です。

現在メンテナンス中のため、しばらくの間ご利用いただけません。

結論からいうと、処理中でなく、処理完了後もこのエラーがでているようなら、
SSHやFTPや、レンタルサーバならファイルマネージャみたいので、
サーバ上のwordpressを置いてあるディレクトリ(フォルダ)直下に
「.maintenance」ファイルができてると思うので、これを削除するか、
不安だったら、「.maintenance_org」など適当な名前にリネーム(変更)したら表示されます。


具体的な内容としては、まあ、既に巷に溢れてるんだろうと思いますが、
共有のレンタルサーバとかでwordpressを利用している場合に、FTPのポートが開いているので、
wordpressのバージョンアップを自ずとFTPで行う場面が多くなりそうですが、
バージョンアップ処理を開始して、実際に新しいバージョンのファイルをコピーする前に、
「wp-admin/includes/update-core.php」ファイルの「update_core関数」によって、
以下のようにメンテナンスにロックファイルが作成されます。(関係ないけど直前に古いロックファイルは消してるみたい)

$maintenance_string = ‘‘;
$maintenance_file = $to . ‘.maintenance’;
$wp_filesystem->delete($maintenance_file);
$wp_filesystem->put_contents($maintenance_file, $maintenance_string, FS_CHMOD_FILE);

で、ブログページ側の挙動を追っていくと、 (wordpressを置いているフォルダを起点に書きます)
1. 「index.php」で「wp-blog-header.php」をrequire。

require(‘./wp-blog-header.php’);

2. 「wp-blog-header.php」で「wp-load.php」をrequire。

require_once( dirname(__FILE__) . ‘/wp-load.php’ );

3. 「wp-load.php」で、「wp-config.php」が存在すればrequire。

if ( file_exists( ABSPATH . ‘wp-config.php’) ) {
/** The config file resides in ABSPATH */
require_once( ABSPATH . ‘wp-config.php’ );

4. 「wp-config.php」で、「wp-settings.php」をrequire。

require_once(ABSPATH . ‘wp-settings.php’);

5. 「wp-settings.php」で、「wp_maintenance関数」を呼び出し。

// Check if we’re in maintenance mode.
wp_maintenance();

6. 「wp-includes/load.php」の「wp_maintenance関数」が呼び出され、
「.maintenance」ファイルがあり、かつファイル内に記載されているepoch値(エポック値)から
600秒(10分)以内の場合には、「wp-content/maintenance.php」があれば、それを表示。
それがなければ、「 _e( ‘Briefly unavailable for scheduled maintenance. Check back in a minute.’ )」が
表示される。

function wp_maintenance() {
if ( !file_exists( ABSPATH . ‘.maintenance’ ) || defined( ‘WP_INSTALLING’ ) )
return;

global $upgrading;

include( ABSPATH . ‘.maintenance’ );
// If the $upgrading timestamp is older than 10 minutes, don’t die.
if ( ( time() – $upgrading ) >= 600 )
return;

if ( file_exists( WP_CONTENT_DIR . ‘/maintenance.php’ ) ) {
require_once( WP_CONTENT_DIR . ‘/maintenance.php’ );
die();
}
:

7. 日本語設定になっている場合には、「 _e( ‘Briefly unavailable for scheduled maintenance. Check back in a minute.’ )」が
「wp-content/languages/ja.po」に基づいて「現在メンテナンス中のため、しばらくの間ご利用いただけません。」が表示される。

#: wp-includes/load.php:178
msgid “Briefly unavailable for scheduled maintenance. Check back in a minute.”
msgstr “現在メンテナンス中のため、しばらくの間ご利用いただけません。”

そして、管理者ページ側もほとんど同じですが、
「wp-admin/index.php」で

require_once(‘./admin.php’);

「wp-admin/admin.php」

require_once(dirname(dirname(__FILE__)) . ‘/wp-load.php’);

されているので、結果、ブログページの3番以降と同じフローにのります。

あとは、メンテナンスページとして自分の作成した内容を表示したい場合には、
「wp-content/maintenance.php」という名前のファイルを作って、表示させればいいです。

サンプルテキストを置くとしたら、

echo “メンテナンス中です。ご迷惑をお掛けしてすいません” > ./wp-content/maintenance.php

簡単にメンテナンスのテストするなら、コマンドラインから以下をたたいて今のepoch値でロックファイルを作ります。
(※当たり前ですが、wordpressはメンテ中になりますので、ご注意ください)

php -r “echo sprintf(‘‘, time());” > .maintenance

ということで、エラーがでたので、久しぶりにphpのコードを読んで、中身を追って、
どこにでもありそうな処理フローの解説をするという誰得っぽい記事を書いてみました。久しぶりの更新なのに。。

nginxでZend Framework(rewrite)を利用する

0
Filed under nginx, php, WebServer, Zend Framework, 未分類

nginx + php-fpm + pecl-apcで構築されたサーバでZend Frameworkを利用する際に、
.htaccessが使えないことで以下のような記述ができませんでした。

## リライトエンジンを有効に。
RewriteEngine On

## リライトの対象パスを指定
RewriteBase /

## リライトルールを宣言(画像、CSS、Javascript)以外をindex.phpに転送する。
RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php

通常の Apache の場合などには、.htaccessで上記のように表現できますが、
nginxでは、現状各ユーザ毎のフォルダに設置して対応する方法がないようです。

具体的にいうと、nginx.confでincludeをサポートしているので、
各ユーザ領域に設定ファイルの断片をおいて、includeさせることまではできると思われますが、
そこを修正しても、読み込み直さないと反映されないので、意味がないという事になります。

よって、対策としては、容易に設定修正できないという難点は致し方ないとして、
/etc/nginx/nginx.conf(ファイルパスは環境により異なります。)、
または、includeしている /etc/nginx/conf.d/***.confの中の該当のドメイン設定部分に
以下のように追記します。

server {
listen 80;
server_name test.example.com ;
location / {
root /home/Web;
index index.php index.cgi index.html index.htm;
rewrite ([^(js|ico|gif|jpg|png|css)])$ index.php;
}
location ~ .php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /home/Webdir/hattara.info/main/web/$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
}

これでとりあえず動くようになります。
現状だと、逆にいえばこれしかできないような気もする。。

.htaccessみたいに外部で設定できるようにできたり、rewriteの設定がもう少しわかりやすいといいなぁと思うけど、
これが速度とのトレードオフなのかもしれないですね。

ということで、rewriteとかの設定で、超はまりまくったけど、今日はこの辺で。

Nginx Http Server

新品価格
¥3,964から
(2010/12/20 19:36時点)

nginx(VirtualDocumentRootもどき)でfastcgi(php-fpm)が動かない

0
Filed under Cent, fastcgi, Linux, nginx, php, WebServer

現在以下のような方法で、VirtualDocumentRootもどきを実装していますが、
PHPのSCRIPT_FILENAMEが正常に取得できないようなので、調査しました。

【変更前】

server {
listen 80;
server_name ~^(.*)\.hoge.com$;
if (!-d /home/hoge.com/$1/web) {
rewrite . http://hoge.com/ redirect;
}

location / {
index index.php;
root /home/hoge.com/$1/web;
}

location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /home/hoge.com/$1/web/$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
}

上記だと、正常に動きませんでした。
原因としては、以下の部分の「$1」の部分に正しい値が入らないためのようでした。

fastcgi_param SCRIPT_FILENAME /home/hoge.com/$1/web/$fastcgi_script_name;

色々試した結果、$1を別の変数として定義してあげれば動くことを確認しました。
結果、以下のような内容になりました。

【変更後】

server {
listen 80;
server_name ~^(.*)\.hoge.com$;
set $subdomain $1;

if (!-d /home/hoge.com/$subdomain/web) {
rewrite . http://hoge.com/ redirect;
}

location / {
index index.php;
root /home/hoge.com/$subdomain/web;
}

location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /home/hoge.com/$subdomain/web/$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
}

とりあえず上記の記述方法で正常動作しました。よかったよかった。

Nginx Http Server

新品価格
¥3,964から
(2010/12/20 19:36時点)

Nginx(virtualhost)+php-fpmでPHPが動作しない(凡ミス編)

0
Filed under Cent, fastcgi, Linux, nginx, php, WebServer

Nginxでvirtualhostを切ってる状態でphp-fpmを動かそうと頑張っていたんですが、
何故か動かない。
あちこちのサイトで説明されてる内容をそのままやって動かない。

一番下にある洋書のNginxの書籍に書いてある例をやっても動かない。
なんでか悩んでいたんですが、平凡なミスであることがわかりました。

元々の手順としては、nginxが導入されている環境に、

1.PHPとPHP-FPMをyumで簡易インストールする。

yum –enablerepo=remi install php php-fpm

2.一応nginxのメインの設定にphpの設定を書いておく

vi /etc/nginx/nginx.conf

# Add
location ~ .php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}

3.自分が作成したVirtualHost用の設定ファイル(/etc/nginx/conf.d/aaa.conf)にも追加する

vi /etc/nginx/conf.d/aaa.conf

server {
listen 80;
server_name test.hoge.com;

location / {
root /home/test.hoge.com/web;
index index.php;
}
location ~ .php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
}

4.php-fpmの起動ユーザーをnginxユーザにしてみる (※必要に応じて変更するかも)

vi /etc/php-fpm.d/www.conf
user = nginx
group = nginx

5.サーバ起動時に自動起動するように起動ファイルのリンク作成

ln -s /etc/rc.d/init.d/php-fpm /etc/rc.d/rc3.d/S87php-fpm

6.サーバ起動させてみる。

/etc/rc.d/init.d/php-fpm start

という手順をしたんですが、htmlファイルは問題なく動作するのですが、phpファイルがうごかない。
真っ白になったり、ダウンロードになったり・・意味がわからない。

結論からいうと、ドキュメントルートの設定がおかしくて、表示したいファイルに到達していなかったという事だった。
どこがダメかというと、上記の「3」に問題があったようだ。

具体的には、

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

ここが問題で、document_root変数の下のfastcgi_script_name変数のファイルをkickするわけだが、
$document_root変数の値が、どうも正しく入っていないようだ。
たぶん、メインの/etc/nginx/nginx.confのrootの値を持ってたりするんじゃなかろうかと思うわけだ。

ということで、以下のように変更して、復旧しました。

fastcgi_param SCRIPT_FILENAME /home/test.hoge.com/web/$fastcgi_script_name;

Nginx Http Server

新品価格
¥3,964から
(2010/12/20 19:36時点)

PHP Fatal error: Class ‘DOMDocument’ not foundに悩まされ

0
Filed under php, Zend Framework

昨日から以下のようなエラーに頭を抱えていました。

PHP Warning: Zend_Loader::include_once(DOMDocument.php) [function.Zend-Loader-include-once]: failed to open stream: No such file or directory in /home/…./ZendFramework/library/Zend/Loader.php on line 146

PHP Warning: Zend_Loader::include_once() [function.include]: Failed opening ‘DOMDocument.php’ for inclusion (include_path=’../app/framework/ZendFramework/library:../app/modules/default/models:.:/usr/share/pear:/usr/share/php’) in /home/…./ZendFramework/library/Zend/Loader.php on line 146

PHP Fatal error: Class ‘DOMDocument’ not found in /home/…./ZendFramework/library/Zend/Feed.php on line 195

Zend_Loader(Zend_Loader.php)というかZend_Loader_Autoloader(Zend/Loader/Autoloader.php)の問題かと思っていたが、
全然関係ないところでエラーになっているのがわかりました。

ただただ、Zend_FeedとかZend_Feed_RssとかでFeed処理をしたかっただけなのだが、これがでてた。

原因としては、至極簡単で、php自体をrpmというかyumで入れたわけですが、
xmlというかdomというかを扱うためのパッケージが足りなかったという事です。

以下の手順で復旧(利用できるように)できました。

※XML用のモジュールをインストールする
yum install php-xml

※読み込み元のApacheを再起動する。
/etc/rc.d/init.d/httpd stop
/etc/rc.d/init.d/httpd start

ということでした。
tar.gzのアーカイブからコンパイルとかしてる人は、
たぶん –with-dom とかでいけるんじゃないですかね。

ZendFrameworkのおすすめ書籍


Zend_Loader::registerAutoloadは賞味期限切れ

0
Filed under php, Zend Framework

今Zend_Frameworkの1.10.2を利用しているわけですが、
Zend_Loader::registerAutoload使ってたら、
以下のようなNoticeなるエラーというかアナウンスというか警告というか出たわけです。

PHP Notice: Zend_Loader::Zend_Loader::registerAutoload is deprecated as of 1.8.0 and will be removed with 2.0.0; use Zend_Loader_Autoloader instead in /home/Userdir/hattara.info/sub/api/app/framework/ZendFramework/library/Zend/Loader.php on line 258

ようするに何がいいたいかというと、Versionが2.0.0になったら消すから、
Zend_Loader::registerAutoload はやめて、
Zend_Loader_Autoloader を使ってねとおっしゃってるようだ。

なので、以下にのせかえてみた。

require_once ‘Zend/Loader.php’;
Zend_Loader::registerAutoload();

require_once ‘Zend/Loader/Autoloader.php’;
$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->setFallbackAutoloader(true);

とりあえずこれで、エラーはでなくなりましたとさ。

ZendFrameworkのおすすめ書籍


Zend_Config_Iniで画面が真っ白に。

0
Filed under php, Zend Framework

初歩的なことなんだと思うんですが、
Zend_Config_Iniでiniを読み込ませたときに、画面が真っ白(ホワイトアウト?)に
なっちゃったわけですよ。

色々テストしてみた結果、読み込み側じゃなく、
読み込まれるIniファイルに問題があったわけですよ。

【誤】

test = ‘test’

【正】

test = “test”

ようするにシングルクウォート(シングルコート)ではダメで、
ダブルクウォート(ダブルコート)では大丈夫ということです。

本当にそういうことなのかどうかはわからんが、parse_ini_fileの説明に
「ini ファイル上の値に英数字ではないものがある場合、 ダブルクォート(“)で囲う必要があります。 」
とあるので、ダブルコートのみOKなんでしょうね。

そうなんでしょうね。

最近こんなんばっかりです。

ZendFrameworkのおすすめ書籍


phpの連想配列をXMLに落とし込む

0
Filed under php, 未分類

phpで作った連想配列をXML形式で吐き出したい場合の例を作ってみました。

<?php

require_once(“XML/Serializer.php”);

$aaa = array(

‘bbb’ => ‘ccc’,

‘ddd’ => ‘eee’,

‘fff’ => ‘ggg’,

);

$options = array(

‘encoding’        => ‘UTF-8′, // ヘッダー情報で指定するエンコード

‘addDecl’         => true, // ヘッダー情報を表示する

‘rootName’        => ‘result’,

);

$obj = new XML_Serializer($options);

$obj->serialize($aaa);

$xml = $obj->getSerializedData();

echo $xml;

?>

上記で実行したものの結果が以下のようにでてきます。

<?xml version=”1.0″ encoding=”UTF-8″?>

<response>

<bbb>ccc</bbb>

<ddd>eee</ddd>

<fff>ggg</fff>

</response>

XMLを表示できない。

0
Filed under .htaccess, php, Zend Framework
Tagged as , , ,

ZendFrameworkの勉強と称して、PHPからXMLを表示しようとしてたわけですが、
XML表示ができずに、以下のようなエラーが出てました。

XML パースエラー: タグの対応が間違っています。終了タグが必要です:

URL: http://zend.hattara.info/Response/
行番号: 11, 列番号: 3:

–^

色々周りの方に確認してもらったりしたら、間違いがボロボロと。。。

  • ZendFrameworkでは、Controller部分には、phpの閉じかっこ「 ?> 」は記載しないらしい
  • XMLを表示する際には、タグの中はシングルクォートではなく、ダブルクォートを利用するらしい
  • 」は「」と競合するので、short_open_tagはOffにする必要があるらしい
  • charsetをUTF-8にしてるのに、ソースをEUCで記載してたので出たらしい

というあたりがありました。
なので、.htaccessで以下を追加したり各内容を修正したりしました。

php_value short_open_tag “Off”

この辺を全部対応して、どうにか動くようになりました。

DB Error: mismatchがでたぞ!!

2
Filed under MySQL, php, SQL
Tagged as , , ,

php経由でMysqlに接続して処理してたときに
なんでか理由がわからないけどエラーがでた。

DB Error: mismatch

試した感じからすると、where句の内容に問題があるようだ。

【エラーが出る例】

select * from table where column != ? ;

  ※「?」はプレースホルダしてるから。
   ちなみにSSH経由でmysqlコマンドで接続して実行するとエラーにならない。

【エラーが出ない例】

 select * from table where column <> ? ;

  ※これだとエラーにならないわけです。

なんでですかね?
 phpとの相性?
 プレースホルダ絡み?
 phpの書き方に問題があった?

ちょっとわからないけど、備忘録として残しておきます。
知ってる人いたら、コメントください。