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

このQ&Aに関連する最新のQ&A

A 回答 (7件)

cronでいいかと。

    • 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

はじめまして。



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

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

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

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

おしまい。
    • good
    • 0

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



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

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

PHPが遅いか速いかってのも、自分で確かめればわかるよ。
    • 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

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

    • good
    • 0

こんにちは。



どんなことをどんな環境でやりたいのかわからないので何とも言えませんが、まず、毎日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

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QPHPでwait処理ってできます?

PHPで処理を一定時間止めるような関数やメソッドってありますか?
sleepとかwaitとかそういう類のものです。
ループで時間を稼ぐとかはしたくないのですが。。。
(CPU時間はあまり食わないように)

Aベストアンサー

sleep 関数があります。

> sleep
> (PHP 4, PHP 5)
> sleep ― 実行を遅延させる
> 説明
> int sleep ( int $seconds )
> seconds で与えられた秒数ぶんプログラムの実行を遅延させます。

参考URL:http://jp.php.net/manual/ja/function.sleep.php

Qillegal string offset

php5.3では動いていたプログラムをphp 5.4 で動かしたらwarning illegal string offsetが出て困っています。以下のプログラムでwarningが出ないようにするにはどのようにコーディングすればよいのでしょうか?


$a = array('exists' => 'foo');
if ($a['exists']['non_existent']) {
print 1;
}
print 2;
exit;

Aベストアンサー

isset()を使えばいいと思います

Q配列をPOSTで受けとる

タイトルのまんまですが
配列をformで送って
それをPOSTで受け取りたいのですが
うまくいきません

具体的に言うと
<?php
print"<form method=POST action=action.php>";

for($i=0; $i<$n; $i++){
   print"<input type=text name=foo[$i]>";
}
print"<input type=hidden name=n value=$n>";
print"<input type=submit value=go>";
print"<form>";
?>


///////////以下action.php//////////////////
<?php
$n = $_POST["n"];
for($j=0; $j<$n; $j++){
   $foo[$j] = $_POST["foo[$j]"];
   print"$foo[$j]";
}
?>


こんな感じのことがしたいのですが
うまくいきません
どうもPOSTされてないみたいでfoo[$j]はnullです
凡ミスな気がしなくもないんですが...プログラム初心者なんで↓↓
教えてください
よろしくお願いします

タイトルのまんまですが
配列をformで送って
それをPOSTで受け取りたいのですが
うまくいきません

具体的に言うと
<?php
print"<form method=POST action=action.php>";

for($i=0; $i<$n; $i++){
   print"<input type=text name=foo[$i]>";
}
print"<input type=hidden name=n value=$n>";
print"<input type=submit value=go>";
print"<form>";
?>


///////////以下action.php//////////////////
<?php
$n = $_POST["n"];
for($j=0; $j<$n; $j++){
   $foo[$j] = $_POST["foo[$j...続きを読む

Aベストアンサー

atsuGTさんこんにちは。


受け取り側は

$foo = $_POST["foo"];

とするだけで$fooに送信された配列が格納されます。


$_POST["foo[添え字]"] ではなく、
$_POST["foo"][添え字] となります。

Qheader(Location:~)で$_SESSION[" "]が保持されない。

自宅サーバー(apache2+php5+mysql5)のlocalhost環境で、
header(Lcation:~)の記述をすると、
セッションが保持されない現象が起きています。

本番環境のレンタルサーバーは、同じ記述で、
しっかりとセッションが保持されます。
この原因は、何でしょうか?

php.iniの設定など、何か考えられることがあれば、
是非教えて下さい。

【やりたいこと】

■a.php
****************************************
<?php
echo<<<EOD
<form method="POST" action="./b.php">
<INPUT type="text" name="test">
<INPUT type="submit" name="Submit" value="確認画面へ">
</form>
EOD;
?>

■b.php
****************************************
<?php
$_SESSION["test"]=$_POST["test"];
header("Location:./c.php");
?>

■c.php
****************************************
<?php
echo $_SESSION["test"];
?>

自宅サーバーだと、
a.phpで入れたデータが、c.phpで表示されません。

レンタルサーバーだと、
セッションが保持され、表示されます。

自宅サーバー(apache2+php5+mysql5)のlocalhost環境で、
header(Lcation:~)の記述をすると、
セッションが保持されない現象が起きています。

本番環境のレンタルサーバーは、同じ記述で、
しっかりとセッションが保持されます。
この原因は、何でしょうか?

php.iniの設定など、何か考えられることがあれば、
是非教えて下さい。

【やりたいこと】

■a.php
****************************************
<?php
echo<<<EOD
<form method="POST" action="./b.php">
<INPUT type="text" name=...続きを読む

Aベストアンサー

php.iniのsession.cookie_path設定が異なっていたとかはないですか?
ページによって再設定していたりすると、'/' と '' では異なるcookie として保存されるので、session id も異なって発行されます。
ブラウザに保存されたcookie情報も確認してみるとよいでしょう。
私も先日、このpath設定をいじってて、「sessionが保存されてない?」「消したのに残ってる?」という状況に遭遇しました。

Qシェルスクリプトからphpファイルを実行する方法

phpのカテゴリなのか迷いましたが、質問させて下さい。


実行するファイルは、a.php、b.php、c.phpの3ファイルになり、SQL文が記載されています。
この3ファイルを.sh(シェルスクリプト)から実行したいと考えております。
どなたか参考サイトまたは実装方法をご教示頂けないでしょうか。

よろしくお願いいたします。

Aベストアンサー

php a.php
php b.php
php c.php

こんな感じ?

参考URL:http://manual.xwd.jp/features.commandline.html

QSQLで特定の項目の重複のみを排除した全項目を取得する方法

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のような構造になっている場合に「項目名1」について重複している項目を排除し、結果として


項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 B    え    イ    江

上のようなデータを取得したいのです。
この時に、Aの重複を排除して取得するレコードは1~3行目のどれでもよいです。
また、データを取得する際には必ずそのレコードの「全項目」を取得したいのでDistinctはうまく使えませんでした。

どなたか詳しい方、方法を教えてくださると幸いです。回答お待ちしております。

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のよ...続きを読む

Aベストアンサー

比較可能で一意性のある値をもてる項目6をテーブルに追加して、

select T.* from T, (select Item1,min(Item6) as Item6 from T group by item1) W where T.item6=W.item6;

――ってやるのが、一番手っ取り早いと思います。
他のところに影響がでないのであればですが。
oracleならrowidを使うとか、レコードの更新時刻を突っ込むとか。

QPHPで別PHPを呼び出す。

PHPプログラムないで別PHPを呼び出し戻り値を受け取ろうと考えています。


test1.php-------------
<?php
print "<html><body>\n";
$return_data= exec(/usr/local/bin/php ./test2.php?param1=1¶m2=2);
print $param1."+".$param2."=".$return_data;
print "</body></html>";

test2.php------------------
<?php
$return_item = $param1 + $param2;
print $return_item;
?>

のように、test1.phpからパラメータを渡し、
test2.phpで計算をして答えをtest1.phpに返す
プログラムを作成しました。

test1.phpからtest2.phpをパラメータをつけて渡すのが
うまくいきません。

execではパラメータをつけることはできないのでしょうか?もしくは他の方法はないでしょうか?

functionやincludeではなく上記の方法で行いたいと思っております。

お手数ですが、アドバイスお願い致します。

PHPプログラムないで別PHPを呼び出し戻り値を受け取ろうと考えています。


test1.php-------------
<?php
print "<html><body>\n";
$return_data= exec(/usr/local/bin/php ./test2.php?param1=1¶m2=2);
print $param1."+".$param2."=".$return_data;
print "</body></html>";

test2.php------------------
<?php
$return_item = $param1 + $param2;
print $return_item;
?>

のように、test1.phpからパラメータを渡し、
test2.phpで計算をして答えをtest1.phpに返す
プログラムを作成しまし...続きを読む

Aベストアンサー

こんにちは。

CやJAVAやっていれば、すぐわかるのでしょうが・・・。
コマンドライン上からパラメータを渡す方法を考えてください。

PHPのようなC言語ライクな言語では慣用的に、

argv や argc といった「arg」が付く変数名が特別な扱い方をされます。
JAVAだと args ですね。
で、PHPだと、
$argv と $argc になります。

$argv は、引数で渡されたパラメータの配列です。
$argc は、パラメータの個数が格納されています。

パラメータの渡し方は、

"/usr/local/bin/php ./test2.php aaa bbb"

のように、半角で区切った形になります。

GETのように、スクリプトのあとに aaa=bbb&ccc=ddd と渡すと
「&」以降が特殊な値ととられてしまいます。

具体的にいうと、 test2.php のパラメータを受け取る部分は以下のようになります。

$param1 = $argv[1];
$param2 = $argv[2];

で、$argv[0] には、./test2.php が入っています。(実行させたいスクリプトへのパス)
また、$argc には、3 が入っています。(配列$argv の要素数)

次に、実行結果を受けとる方法ですが、

test2.phpから、実行結果を受け取りたい場合は、exec 関数は、他の言語の exec 関数より便利に出来ています。

test1.php を以下のようにしてください。

exec("/usr/local/bin/php ./test2.php aaa bbb" , $rec , $status);
if ($status != 0){
print "失敗しました";
exit(1);
}

test2.php は、

print $return_item;
exit();
?>

とした場合、
$rec に print で出力した結果が入っていると思います。

※注意

実をいうと $rec には意図した結果以外に色々なデータも入っています。
たとえば、test2.php で、

$aaa = "aaaa";

print $aaa;

とした場合、
$rec には、

$rec[0] : Content-type: text/html; charset=EUC-JP
$rec[1] : X-Powered-By: PHP/5.0.2
$rec[2] :
$rec[3] : aaaa

という値が入っています。
$rec[0] から $rec[2] までは環境によって違います。つまり、test2.php から受け取ったデータが $rec のどの要素に入っているかは、環境によって違ってきますので、まず、


exec("/usr/local/bin/php ./test2.php aaa bbb" , $rec , $status);
if ($status != 0){
print "失敗しました";
exit(1);
}
print_r($rec);


で、確認してみてください。

こんにちは。

CやJAVAやっていれば、すぐわかるのでしょうが・・・。
コマンドライン上からパラメータを渡す方法を考えてください。

PHPのようなC言語ライクな言語では慣用的に、

argv や argc といった「arg」が付く変数名が特別な扱い方をされます。
JAVAだと args ですね。
で、PHPだと、
$argv と $argc になります。

$argv は、引数で渡されたパラメータの配列です。
$argc は、パラメータの個数が格納されています。

パラメータの渡し方は、

"/usr/local/bin/php ./test2.php aaa bb...続きを読む

QJavaScriptde途中で、「exit」するには?

function kensaku(){
s_data = document.kaiin_form.input_name.value;

if(!s_data){ alert("キーワードを入れて下さい!"); }

if(s_data != dumy){ ...... }
for(i=st_no;i<=n;i++){
......省略.................;
.......省略................}
}

----------------------------------
3行目で表示されたアラートをOKで閉じても、4行目以下が実行されてしまいます。
3行目でexitするにはどうすれば良いでしょうか?

Aベストアンサー

>関数(kensaku())からは抜けられませんでした。
そうですね、勘違いしていました、f(^^;
すみません。
if(!s_data){
alert("キーワードを入れて下さい!");
return;
}
ですね。

Q配列をファイルに書き込む方法

下記($dataに入ってる)配列をファイルに書き込みたいのですが、書き込み方法が分かりません、教えていただけませんでしょうか・・・。
$dataの中身は
Array
(
[0] => あいうえお
[1] => かきくけこ
[2] => さしすせそ
[3] => たちつてと
)
これを
$fp=fopen("1.txt","w");
fputs($fp,$data);
fclose($fp);
にするとArrayとだけ表示されます。
あいうえお\n
かきくけこ\n
さしすせそ\n
たちつてと\n
と書き込みたいのですが・・・、お願いします。

Aベストアンサー

<?php
$data = Array(
0 => 'あいうえお',
1 => 'かきくけこ',
2 => 'さしすせそ',
3 => 'たちつてと'
);
$fp=fopen("1.txt","w");
foreach ($data as $a){
fputs($fp,$a."\n");
}
fclose($fp);
?>

↑これでいかがでしょうか?

QPHPのTRUEとFALSEについて 値を返すというけれど、なぜ「1」かブランク(何もなし)なのでしょうか?

以下の文を実行すると、$abcには「3」があるので、TRUEになるはずなのですが、
エコーすると「1」と記載されます。

<?php
$abc = "283743";
$abc = ereg("3",$abc);

echo $abc;

?>

以下の文を実行するとエコーしても何も表示されません。
「0」は該当しないので、FALSEと表示されると思うのですが・・。

<?php
$abc = "283743";
$abc = ereg("0",$abc);

echo $abc;

?>

ネットで調べると、それぞれTRUEとFALSEを返すと記載がありました。
それなのになぜ「0」と「何もなし」になるのでしょうか。

Aベストアンサー

まず、eregの戻り値ですが
・マッチした場合は int型の1を返して
・マッチしない場合は bool型のfalseを返す
ようですね(CentOS-CLI版PHP5.2.5で確認)

・・・マニュアルの該当部分を見ると
確かに int で返ると書いてありますが、どうもマニュアルと違うようです・・・。

で、それらが返るとしてechoで表示されない理由ですが
int(1)の場合とfalseの場合で理由が異なります。

まず、falseですが
echo false;
とやると、falseがstring型へ自動型変換という手順を踏んでechoの対象になりますが
PHPの場合は falseをstring型へ変換すると ""(空文字列)になります。
(別の言語では"false"という文字列に変換されるものが多いですね)
よって、出力されません。

次に、int(1)が出力しない理由ですが
> echo $abc;
の部分を
echo $abc . "\n";
として動作確認して貰っていいでしょうか?
多分それで"1"と表示されるようになるはずです。

なぜ、改行文字をつけないと出力されないのかは
理由がわかりません・・・。

まず、eregの戻り値ですが
・マッチした場合は int型の1を返して
・マッチしない場合は bool型のfalseを返す
ようですね(CentOS-CLI版PHP5.2.5で確認)

・・・マニュアルの該当部分を見ると
確かに int で返ると書いてありますが、どうもマニュアルと違うようです・・・。

で、それらが返るとしてechoで表示されない理由ですが
int(1)の場合とfalseの場合で理由が異なります。

まず、falseですが
echo false;
とやると、falseがstring型へ自動型変換という手順を踏んでechoの対象になりますが
P...続きを読む


人気Q&Aランキング