アプリ版:「スタンプのみでお礼する」機能のリリースについて

毎日一回実行したいphpはsleepを使うのが良い方法でしょうか?
cronでなくphpだけでやりたいです。
sleepしている間の負荷はどうなんですか?
while(1)よりは軽い負荷なんでしょうか?

A 回答 (7件)

こんにちは。



どんなことをどんな環境でやりたいのかわからないので何とも言えませんが、まず、毎日1回実行したいのであれば、どちらにしろループが必要ですよね。
確認したわけではありませんが、sleep の方が軽いでしょうが、時間がずれるって事はあるようです。

それと、大事なことがいくつかあります。

PHPはこういった処理をさせるような言語ではないと思いますが・・・。
デフォルトではおそらくPHPは30秒しか動作しない設定になっています。

もしやるならより高速でメモリも食わないC言語や、Perl言語を使うべきだと思うのですが。
C言語やPerlはそういった使い方も想定してある言語でしょうし。

参考に、単純にWhileを使った場合、他の言語の速度がPHPに対してどれだけ高速か試してみたところ、
C言語・JAVAが100倍。Perlが2倍ほどの速度になりました。

それと、必ずコマンドラインでそのPHPプログラムを起動させてください。
ブラウザ等で、
http://aaaaa.bb.cc/every_day.php
と、アクセスし永久ループが発動するというやり方はWebサーバを巻き込みますので、サーバがこける可能性もあります。
コマンドラインで、(※環境によって違います)

$ /usr/bin/php /home/http/html/every_day.php &

みたいな感じですかね。

なんか質問からみるとレンタルサーバと言った他人のサーバ上で実行させたい。みたいな気がしますがどうでしょうか。(じゃなきゃcronやWindowsだったらそういったソフトを使いますよね)
もし、他人のサーバを借りて、そこでこうしたループをやりたい場合は・・・・。
うーん。やらないでください。(^ ^ ;ゞ

あくまでこうしたことをやりたい場合は、高いお金を払って自分専用のサーバを借り+管理してもらった状況か、自分でサーバを立ててる状況だけだと思いますよ。
    • good
    • 0
この回答へのお礼

PerlよりPHPの方が高速でメモリも食わないものなんじゃないでしょうか。

レンタルサーバでcronが使えず、サーバ言語はPHPしか使えないという環境です。

お礼日時:2005/04/06 17:03

Windowsであれば、タスクスケジュールで行うのはどうでしょうか?

    • good
    • 0

うーん。

どこかの素人サイトで「PHPはCGIより高速で軽いです」なんていってるのを真に受けてる気がします・・・。彼らは何を根拠にこんなこと言ってるんですかね。たいていこれらのサイトでは、その速い・軽い理由は書いてなかったりします。
ちょっとこの質問からはずれてしまいますが、

まず、PHPがCGIより高速なのは、Apacheのモジュール、つまりApacheの機能として動作するためです。
よって、レスポンスが速いだけです。たとえば、ブラウザやアウトルックエクスプレスを起動したとき、数十秒待たされますが、この起動が短縮される。と、いう感じですかね。

今は、mod_perlというモジュールがありますので、これを組み込んだApacheで動作するPerlのCGIは、モジュールとして組み込んであるPHPより数倍速いです。
PHPアクセラレーターというのがありますが、これはコンパイル時間が短くなるだけです。(mod_perlも同じ)

perlと、PHPと、PHP + PHPアクセラレーターで

for($i = 0; $i < 1000000; $i++){ }

というループを処理させると、Perlが1.2~2.0倍速く終了するでしょう。また、PHPとPHP + PHPアクセラレーターは、ほとんど差がみられないでしょう。コンパイル時間のコンマうん秒速い程度かな。
単純な速度比較をやればわかりますが、PHPは遅いです。

メモリについてですが、PHPがどうやって動作するかわからないと、私がここでいくら説明してもわからないでしょう。
PHPが変数の宣言がいらないのはなぜか、変数に文字列を入れることが出来るのはなぜか。
PHPの上級者でも、よくわかっていない人が多いのでなかなか難しいでしょうが、とにかく他の言語と比較して遅くてメモリも喰う。と、理解してかまわないと思いますよ。
これは、JAVAをはじめPHPも、ネイティブコードにコンパイルできないのが理由になりますが、とある処理をC言語で作られたアプリと、JAVAで作られたアプリで比較したら、Cが0.15MBだったのに対して、JAVAは8MBのメモリを消費していました。


>レンタルサーバでcronが使えず、サーバ言語はPHPしか使えないという環境です。

なるほど。
やってみればわかりますが、御希望の処理は出来ません。それは以下の理由によります。

1つ目、PHPがでフォルトで処理する時間が決まっている。
2つ目、ブラウザを閉じた場合どうなるんでしょうかねぇ。PHP側である程度コントロールできますが、ApacheといったWebサーバが動作しているPHPを殺してしまうかもしれません。
3つ目、レンタルサーバ屋さんか、同じサーバを借りている人に怒られます。(たぶん、レンタルサーバ屋さんがすぐに気づいて、終了させられるでしょう)


もし、どうしてもやりたいというのであれば、Windowsで定期的にPHPプログラムにアクセスするようなアプリを用意するのが確実でしょうね。ただし、この場合はWindowsが起動しているときしか実行はされませんが。
私の場合は、1日の大半が起動しているので問題ありませんが、そうでなければある程度妥協しないと難しいです。

それより、cron 使えるレンタルサーバを探す方が確実かな。
    • good
    • 0
この回答へのお礼

実際、sleep(60)をやったら30秒でエラーが返されました。
設定で30秒というのを延長できるようですが、その30秒は無限ループの失敗を止めてくれたりするものだとおもうので、それは変更したくないので、30秒以上のsleepは無理のようでした。
30秒ごとに自分を実行して今の自分を終了することを繰り返し、1日たてば日バッチを実行というのならできそうでした。

ブラウザを閉じた場合も大丈夫だと思います。
起動はHTMLのアンカーからでもそのphpを呼び出せば、HTMLを閉じてもphpは処理が完了するまでは動いていると思います。

30秒ごとのsleepなら怒られないと思います。
ただ、30秒に相当するwhile(1)だと怒られますが、sleepはたぶん大丈夫なんですよね?

モジュールとして組み込んだCGIはPHPを凌ぐ速度が出るというサイトを見た記憶がよみがえりりましたが、モジュールというのが分からないので、それだとphpの方が速いということでいいんですよね?

お礼日時:2005/04/07 16:15

まず、ここで質問する前に、借りているサーバの管理者には許可をもらいましたか?



それともう少し知識と経験を付けてから、そのような「負荷のかかる」処理をするプログラムを作ってください。

ブラウザを閉じても大丈夫とか、30秒なら怒られないとか、sleepなら大丈夫っていうのは何が根拠なんだろ。

PHPが遅いか速いかってのも、自分で確かめればわかるよ。
    • good
    • 0

はじめまして。



Webサーバ上で処理を流しっぱなしというのは、
Webサーバが想定していないといいますか、
変な処理といいますか、知っている人から見ると
筋が悪い実装方法と思います。

サーバの管理者の立場から見ますと、
そのような処理はぜひ作ってほしくない
という種類のものであると思います。

基本的にはCRONを使えるサーバを利用することが、
根本的な解決策であると思います。

もしも、実用上問題がなければという前提つきですが、
こんな方法もあります。
 1)何でもよいので他のホームページがクリック
  されたついでに処理を行うPHPがついでに
  呼ばれるようにしておく。
 2)前回実行した時間を保持しておき、
  それと比べて、今回が実行すべき時間で
  であれば、実行する。
  (2日たっていたら2回実行する(謎))

おしまい。
    • good
    • 0

質問とはかけ離れていますが…



1日に1回だけ動けばいい(時間は決まっていない)のならば、他力本願で行ってみては?

1日に1回以上アクセスのあるサイトならば、同日に1日1回動かしたいスクリプトが動いたかどうかをテキストか何かにログとして保存させておいて
その日初めてアクセスのあった瞬間に1日1回動かしたいスクリプトを起動させる


--------index.php(coding面倒なので、日本語)
本日日付取得;
text.logsを読み込み;
if(本日日付が存在しないなら){
 1日1回スクリプトをincludeする;
 text.logsに本日日付を追加書込;
}
------------

----text.logs
2005-04-09
2005-04-10
2005-04-11
------------
    • good
    • 0

cronでいいかと。

    • good
    • 0

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