月別アーカイブ: 2013年1月

cron登録数1個で複数の間隔で実行する方法

レンタルサーバーによってはcronの登録数は1つだけー!みたいなのもよくありますが

実行したいスクリプトを呼び出す役割のcron用スクリプトを書けば複数の間隔で複数のスクリプトを実行することができます。

例えば、cronに登録するスクリプトを「cron.php」とかにした場合。この「cron.php」はサーバーが許す一番最小実行間隔で実行するとします。(例えば1分ごと)

これで「cron.php」は1分毎に実行されるので、あとはその中で条件分岐させて色んなタイミングでいろんなスクリプトを呼び出せばOKです。

例えば10分毎に一回実行したスクリプトがあるときは

switch(date('i')%10) {
 case 0:
  include(/home/xxxx/xxx/xxxx/oppai.php);
  break;
 case 1:
  ・・・・・・
  break;
}

の様に書きます。呼び出すスクリプトが大量にある場合は上記のようにswitch文でも使って実行時間をうまく分散させるのがレンタルサーバー様に嫌われないコツです。

▼うまく分散させる振り分けのサンプル
・毎分1回実行するもの→そのまま毎分実行させる(しかない。分散のしようがない)。
・10分毎に1回実行するもの→「分」の下一桁が6,7の時に実行(最大2個に分散できる)
・毎時1回実行するもの→「分」の下一桁が0,1,2,3,4,5の時に実行(最大36個に分散できる)
・1日1回実行するもの→「分」が58 の時に実行(時間毎に振り分ければ最大24個に分散できる)
・毎週1回 実行するもの→毎日2:59に実行(曜日毎に振り分ければ最大7個に分散できる)
※それぞれの間隔で実行したいスクリプトの量によって数字は微調整すればよい。

 

[OpenPNE] 日記やメッセージなどの機能を追加する方法

OpenPNEをインストールしたが、日記を書く機能が無い。メッセージの機能もない。それどころが色んな機能が全然見当たらない!

OpenPNEは機能が欲しい場合は、アプリケーションプラグインという形で追加するシステムになっているんですね。

OpenPNE3.8.4プラットフォームだけをSSHでサーバにインストールしたようでした。

プラグインの情報は[OpenPNE ブログ プラグインリリース情報]や[http://plugins.openpne.jp]で確認出来ます。

インストール方法はSSHでサーバに接続して、以下のように叩きます。(方法は[http://plugins.openpne.jp]の各プラグインページに記載されている)

プラグインをインストールします。
$ ./symfony opPlugin:install opDiaryPlugin -r 1.5.0

モデルとデータベースの更新をします。
$ ./symfony openpne:migrate --target=opDiaryPlugin

こんな感じです。

[ロリポップ!] PHPがブラウザでは動くが、cronでは動かない(ハマリ度約3時間)

3時間くらいハマリましたね。(見栄張ってるんで実際は5時間くらいハマってたと思います)

phpで書いたデータをDBに突っ込むプログラムが、

ブラウザでは実行できるんだけど、cronでは動かない。(実際にはプログラムは実行されてたんだけど、DBには突っ込まれていなかった、って感じ)

今回のハマりポイントは2つあります。

1つ目は、ロリポップ!のPHP設定でphp5.3を使用する設定していたんだけど、cronの場合はこの設定が反映されるわけではない。cronでphp5.3を使うにはパスを書く必要があった。プログラムの1行目に以下のように。(ロリポップ!cronの設定

#/usr/local/php5.3/bin/php

2つ目のポイントは、プログラムの中にphp5.3以降で有効になった記述方法を使っていたということ。この内容はコレです↓

$oppai = (get_oppai() ?: 0);

「三項演算子」というやつです。この、?と:の間を省略する形はphp5.3からできるようになった文法だったのです。そりゃオッパイゲットできなかったわけです。

なんでこのことに気づいたか。

それは、PHPのオンラインマニュアルで流し読みしていた時に瞬間視記憶としてある文章が頭に残っていたからです。その文章とは

「・・・・・・PHP 5.3 以降・・・・三項演算子のま・・・かの部分をな・・・・・・ともできる・・・・になりました。 ・・・・・・・・・・・・・」

これやーーーーーーって感じでした。

これ、たまたま気づけたけど、実際はもっとハマリ度高めだと思いますね。