PHP5.5での初歩的な質問です。

phpファイルをrequire_onceで読み込み展開する場合、頻繁に(MAX1分毎に)呼び出し時間がかかりそうな関数と、アクセス数が少なくすぐ終わりそうな関数と、同じファイルに書いても問題ないですか?
というのは、時間がかかる関数はバッチメインで処理しますが、ユーザーアクセスからも結構使用します。
バッチが占領している間、ユーザーが待たせられるということは無いのですか?
以前、同じ処理を複数書くのはカッコ悪いと聞いたことがあるので、世の中の人たちはどのようにしているのか?また、何ら問題ないのか?教えていただければ幸いです。

また、マニュアルを読んでもrequireとincludeの違いがイマイチわかりません。
文面上は理解できるのですが、そのあとそれがどういう影響でどういうところに問題が生じるのか?解らずにrequire_onceを使い続けています。
この辺も関係あるならば合わせて教えてください。

よろしくお願いします m(_ _)m

回答の条件
  • 1人1回まで
  • 登録:
  • 終了:2014/09/29 12:13:37
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:tobeoscontinue No.3

回答回数220ベストアンサー獲得回数59

ポイント50pt

同じファイルに何を書くかは作者が決めていいのですが何を基準に考慮するかは人それぞれだと思います。
私の場合は使用損度や機能で分けています。よく使うもの、たまにしか使わないもの、エラー対応、mail送信など。
ある程度自分のポリシーが無いと後になってこの関数はどのファイルに入っていたっけ。ということになりかねません。

時間がかかりそうな関数heavy()と、すぐ終わりそうな関数light()とに関連性がなかったら私なら二つのファイル
foo.php, bar.phpに分けます。

バッチメイン.php
require_once 'foo.php'; // heavy()を使う

ユーザーアクセス.php
require_once 'foo.php'; // heavy()を使う
require_once 'bar.php'; // light()を使う

>マニュアルを読んでもrequireとincludeの違いがイマイチわかりません。
マニュアルによればファイルが無かった場合の対処方法の違いのようなので
私なら想定外の事が起こったのなら被害を拡大させないためにそこで停止してもらったほうがいいのでrequire、require_onceを使います。
自分で対処がしたいのならinclude、include_onceでコントロールをもらい後始末などをすることになるでしょう。

pluginのように前もってファイルの存在が解らないけどファイルがあればそれをincludeすることで新しい機能が使えるようにもできます。
requireにはこのような機転はききませんが要は違いを自分はどう利用するかということかと。

perlではよく
open(DATAFILE, "< data.txt") or die("Error");
というのを見かけます。ファイルをopenしてエラーだったらdie()するというもので、requireに似ています。
die()の付かないopen()がincludeという感じですか。そのためエラーが無かったかの確認が必要なのですが。

includeもrequireと同じように使っているのをよく目にします。つまりincludeのエラーに対して想定していないのです。
そのためincludeの方が危険だとは思います。(ファイルは存在しても検索パスの間違い)

requireでなければならない意外はrequire_onceでいいように思います。

>バッチが占領している間、ユーザーが待たせられるということは無いのですか?
状況がイマイチ飲み込めないorz。

他1件のコメントを見る
id:tobeoscontinue

>プログラムをサーバーがロードしたら
ロードとはコピーですのでバッチアクセスとユーザーアクセスがプログラムなら同じファイルがコピーされるだけなので競合とはなりません。
バッチアクセスのheavy()と
ユーザーアクセスのheavy()はコピーされたものですが違うものです。
そのためバッチアクセスのheavy()が時間がかかっているからといってユーザーアクセスのheavy()が待たされるということはありません。

しかしheavy()が同じファイルに書き込みをするようなら競合を考慮する必要があります。
http://www.programming-magic.com/20080211020413/
つまりheavy()が何をしているかによって競合するのかしないのかは変わってくるというのがより正しいかと。

多くのOSでは並行処理があたりまえなので競合を頭の隅に置いてプログラムすることは大事なことだと思います。

>バッチ処理のプログラムが外部通信エラーなどで思いのほか実行が中断した場合、そのメモリー領域は解放されずそのまま占領されたまま??
通信エラーがあればその時点でバッチ処理のプログラムが終了させられて解放されると思います。
応答が返ってこない場合でもタイムアウトまで待たされますが終了させられて解放されるでしょう。

2014/09/27 22:11:32
id:wsapp

丁寧に教えていただいてありがとうございます。

> 応答が返ってこない場合でもタイムアウトまで待たされますが終了させられて解放されるでしょう。
ユーザーが待たされる場合は、外部通信で応答が返ってこない場合のみで、関数を書くファイルなど教えていただいたことなど自分の法則で書けばいいということですね。
ありがとうございました。

2014/09/29 12:11:38

その他の回答2件)

id:pogpi No.1

回答回数428ベストアンサー獲得回数59

ポイント10pt

同じソースを参照しても、どちらかが待たされることはありません。
問題ないですし、同じ処理なら二回書く必要はないのでむしろそうするべきでしょう。

id:sasada No.2

回答回数1482ベストアンサー獲得回数133

ポイント40pt

 pogpiさんのおっしゃるとおり、重い処理と軽い処理を一つのファイルに書いても、ファイル読込のパフォーマンスにはほとんど影響しませんので、心配は無用です。

 あと、require文とinclude文の違いについては、ここがわかりやすいと思います。
http://php.net/manual/ja/function.require.php

require は include とほぼ同じですが、失敗した場合に E_COMPILE_ERROR レベルの致命的なエラーも発生するという点が異なります。 つまり、スクリプトの処理がそこで止まってしまうということです。一方 include の場合は、警告 (E_WARNING) を発するもののスクリプトの処理は続行します。

 成功した際の動作は一緒ですが、失敗したときの挙動が異なるわけですね。

id:wsapp

回答ありがとうございます。
重い処理と軽い処理に併記ついては解りました。


> 失敗した場合に E_COMPILE_ERROR レベルの致命的なエラーも発生するという点が異なります。
これは解るのですが、読み込みに失敗した場合、エラーを返そうが処理を止めようが、結局関数を読み込めてないので処理は中断されるのではないですか?

それとも、読み込みエラーが発生した場合includeだと、エラー処理を記していればそこへ導けるということでしょうか?
では何のためにrequireは存在するのですか?処理が早いとかメリットがないと必要ない気がしますが。

皆さんはどういうタイミングで使い分けるのですか?

2014/09/25 15:53:39
id:sasada

 実際、異常終了させるか否かくらいしか意識してないですね、私は(笑)
 テクニカルなことを言うと、includeするソースに

<?php
# (いろんな定義)
   return TRUE;
?>

と書いておいて、読込側で

  if (!(include "呼び出し.php")) {
#     失敗時の処理
  }

という風に書けるので、便利ではあります。
 異常終了でいいならrequireで充分でしょうけど。

2014/09/25 17:13:17
id:tobeoscontinue No.3

回答回数220ベストアンサー獲得回数59ここでベストアンサー

ポイント50pt

同じファイルに何を書くかは作者が決めていいのですが何を基準に考慮するかは人それぞれだと思います。
私の場合は使用損度や機能で分けています。よく使うもの、たまにしか使わないもの、エラー対応、mail送信など。
ある程度自分のポリシーが無いと後になってこの関数はどのファイルに入っていたっけ。ということになりかねません。

時間がかかりそうな関数heavy()と、すぐ終わりそうな関数light()とに関連性がなかったら私なら二つのファイル
foo.php, bar.phpに分けます。

バッチメイン.php
require_once 'foo.php'; // heavy()を使う

ユーザーアクセス.php
require_once 'foo.php'; // heavy()を使う
require_once 'bar.php'; // light()を使う

>マニュアルを読んでもrequireとincludeの違いがイマイチわかりません。
マニュアルによればファイルが無かった場合の対処方法の違いのようなので
私なら想定外の事が起こったのなら被害を拡大させないためにそこで停止してもらったほうがいいのでrequire、require_onceを使います。
自分で対処がしたいのならinclude、include_onceでコントロールをもらい後始末などをすることになるでしょう。

pluginのように前もってファイルの存在が解らないけどファイルがあればそれをincludeすることで新しい機能が使えるようにもできます。
requireにはこのような機転はききませんが要は違いを自分はどう利用するかということかと。

perlではよく
open(DATAFILE, "< data.txt") or die("Error");
というのを見かけます。ファイルをopenしてエラーだったらdie()するというもので、requireに似ています。
die()の付かないopen()がincludeという感じですか。そのためエラーが無かったかの確認が必要なのですが。

includeもrequireと同じように使っているのをよく目にします。つまりincludeのエラーに対して想定していないのです。
そのためincludeの方が危険だとは思います。(ファイルは存在しても検索パスの間違い)

requireでなければならない意外はrequire_onceでいいように思います。

>バッチが占領している間、ユーザーが待たせられるということは無いのですか?
状況がイマイチ飲み込めないorz。

他1件のコメントを見る
id:tobeoscontinue

>プログラムをサーバーがロードしたら
ロードとはコピーですのでバッチアクセスとユーザーアクセスがプログラムなら同じファイルがコピーされるだけなので競合とはなりません。
バッチアクセスのheavy()と
ユーザーアクセスのheavy()はコピーされたものですが違うものです。
そのためバッチアクセスのheavy()が時間がかかっているからといってユーザーアクセスのheavy()が待たされるということはありません。

しかしheavy()が同じファイルに書き込みをするようなら競合を考慮する必要があります。
http://www.programming-magic.com/20080211020413/
つまりheavy()が何をしているかによって競合するのかしないのかは変わってくるというのがより正しいかと。

多くのOSでは並行処理があたりまえなので競合を頭の隅に置いてプログラムすることは大事なことだと思います。

>バッチ処理のプログラムが外部通信エラーなどで思いのほか実行が中断した場合、そのメモリー領域は解放されずそのまま占領されたまま??
通信エラーがあればその時点でバッチ処理のプログラムが終了させられて解放されると思います。
応答が返ってこない場合でもタイムアウトまで待たされますが終了させられて解放されるでしょう。

2014/09/27 22:11:32
id:wsapp

丁寧に教えていただいてありがとうございます。

> 応答が返ってこない場合でもタイムアウトまで待たされますが終了させられて解放されるでしょう。
ユーザーが待たされる場合は、外部通信で応答が返ってこない場合のみで、関数を書くファイルなど教えていただいたことなど自分の法則で書けばいいということですね。
ありがとうございました。

2014/09/29 12:11:38

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません