いつもお世話になっております。
PHP5.2.5 Apache1.3.37 SQLite3.3.7
例えば、
fopen()や、sqlite_open()のような関数の場合、
trueが返されないと、その後の処理が進みませんので、
そうならないように、対処したいと考えています。
その方策として、
まず、私が考えたのは、
if(sqlite_open($file_name)){
//該当ファイルが開けたら行われる処理
}
elseif(sqlite_open($file_name)){
//再チャレンジ1(きまぐれな「オープンエラー」かもしれないので)
}
elseif(sqlite_open($file_name)){
//再チャレンジ2(念には念を)
}
else{
die("致命的なエラーがあるようなので、開けませんでした。");
}
ちなみに、sqlite_open()等で、「false」が返ってくる場合というのは、
(1)気まぐれ(ごく稀に、何らかの理由で偶発的に起こる)
(2)致命的な問題(常にエラーが吐かれる)
この二つが考えられると思っております。
(2)に対する処理は単純で、
エラーが返ってくる際の、
(1)でない場合が、(2)なのだと思います。
問題なのは、(1)の、気まぐれエラーです。
この気まぐれが、どういう理由から起こるのか、
私には全く検討もつきませんが
(もっとも、そんなものは、まず起こらないものなのかもしれませんが)、
この気まぐれエラーから、
スクリプト完遂を阻止されないための方策(テクニック)について、
どなたか、アドバイスして下さい。
「気まぐれエラーが訪問者のブラウザに吐かれたら、
リロードしてもらえばいいのでは?」
というのではスマートではない気がするので(実はこれが最もスマートだったり?)、
業界標準的なテクニックがあれば、教えて頂きたいと思っております。
「私は、こんな感じでやってますけども~」
というアドバイスも大歓迎です。^^
どうぞよろしくお願い致します。
No.1
- 回答日時:
気まぐれエラーとはいっても、
そう簡単には起こらないものです。
ファイルをつかんでいても、一瞬で離せば、ほんの少しストップする程度。じゃなければ、いつ開放されるか不明。
そういう類の処理だとsleepを使うことが比較的多いかと思いますよ
プログラムの処理時間というものもありますから、
失敗してすぐにアクセスしても、その処理に進むまでにかかる時間は数ミリ秒なんていう、ほぼ間隔無しの時間なので、
その数ミリ秒でエラーが解決されてる可能性は限りなく低い
アプリケーションやOSがアクセスする処理でしたらsleepでもいいのですが、
ユーザーが何度もアクセスするような処理の場合でしたら、
率直にエラーにして、
「うまくデータを取得できませんでした。もっかいアクセスしてみてください」
と出したほうが、ユーザーへの負担もCPUへの負担も低くなると思いますよ
回答下さり、ありがとうございます。
・気まぐれエラーは、滅多に起こらない。まず起こらない。---★(1)
・「サーバに大きな負荷が一時的に掛かった」等の理由でエラーが吐かれてしまった場合に、
if,elseifなどの方法では、ifとelseif、それぞれの処理時刻をほとんど隔てられないことから、
結果的に、それぞれから得られる結果はほとんど変わらないことになるため、対策としては有効とは言えない、と。
この視点は私にはないもので、大変有益でした。
私の考えていた「気まぐれエラー」とは、
SF系の話にありがちな危機的状況で例えると、
コンピュータを殴って、
「おい!動け、頼むから動いてくれぇぇ!」
こんな感じです。
つまり、エラー発生が
時刻とは全く関係なく起こり、
その時の叩き具合で変わるような、そんなエラーを、
気まぐれエラーとして想定していました
なので、
ご指摘のように、ifとelseifの間には、数ミリ秒くらいの時間的間隔しかありませんが、
叩き具合(叩くタイミング)に意味がある、と私は思っていたので、
ifとelseifによる方法でも、それなりに意味はあると思っていました。
実際、この辺りはどうなのでしょうね。
で、
sleepを使う方法と、
ユーザのリロード依存の方法とを提示頂きましたが、
後者のアクセスタイミングには自由度、つまり、柔軟性がありますよね。
アクセスのトライ回数的にも、時間間隔的にも、
ユーザのさじ加減で、なんとでもなりますから。
一方、前者では、
こちら側で時間と、場合によっては回数を指定することになるわけですから、
その指定しておいたタイミングでは問題が解決されなかった場合には、
結局、ユーザのリロード依存になるわけですよね。
以上のことから(特に、★(1)を重要視)、
ユーザのリロード依存の方法で、問題なさそうだなと感じました。
die("何度アクセスしてもダメな場合は、しばらく時間をあけてトライして下さい");
のようなメッセージを出す設計で検討してみようかと思います。
※念のため、もう少し、回答を待ってみます。
どうもありがとうございました。
No.2ベストアンサー
- 回答日時:
<?php
function sqlite_open_r($file_name){
$retries = 0;
$max_retries = 100;
do{
if($retries > 0){
usleep(rand(1, 10000));
}
$retries += 1;
}while((!$obj = @sqlite_open($file_name)) and $retries <= $max_retries);
if(is_resource($obj)) return $obj;
return false;
}
?>
http://jp2.php.net/flock
flock関数のユーザ投稿の5番目の書き込みを参考にしました。
sqliteがリソースを返すまではusleepでタイミングずらして100回までリトライをかけるというものですね。(業界標準ではないと思います)
ただ、mizutakiさんの仰るとおりユーザに再表示を促すほうが良い気はします。
どちらにせよ、DBをmysqlとかに以降した際、使える方法ではないので。
今回も多くのことを学ばせて頂きました。
do while文というものを、初めてちゃんと眺めた気がします。
お尻で、繰り返しの条件判断をしているんですね。
usleep()も調べて来ましたが、引数はマイクロ秒扱いなので、
10000という数値でも、たったの、100分の1秒なわけですよね。笑
1~10000のランダム数といっても、人間にとっては、それほど変わらない話ですよね。笑
でも、機械には意味がある、と。
>ただ、mizutakiさんの仰るとおりユーザに再表示を促すほうが良い気はします。
なるほどなるほど。
do while文の仕組みは理解できましたが、
こんな質問を書いておきながら言うのもなんですが、
やや頑張りすぎな処理を導入している感じですよね。
ホゲホゲさんは、それを承知の上で、
あえて、
「もし、そういうことをしたいのであれば、こんなのならありますけど」
と教えて下さったのだと思います。笑
いつも、気を使って頂き、どうもありがとうございます。
で、ちょっと話は変わりますが、
今回、一番印象に残ったことは、
「flock関数のユーザ投稿の5番目の書き込みを参考にしました。」
ここです。笑
英文ドカーンの中から、よくぞ見つけてこられました…。笑
私も見習いたいと思います◎
>どちらにせよ、DBをmysqlとかに以降した際、使える方法ではないので。
保守性、汎用性も考慮頂き、ありがとうございます!
この辺りの+αの情報も、毎回参考になっております。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- IT・エンジニアリング 不具合の現状認識をしないプログラマって信用できる人? できない人? 8 2023/07/28 09:09
- Visual Basic(VBA) vbaのエラー対応(実行時エラー7:メモリが不足しています) 4 2023/04/24 00:20
- FX・外国為替取引 MQL5にて謎のエラーが発生!だれか対処を教えてください! 1 2023/03/25 15:59
- Visual Basic(VBA) vbaエクセルマクロについて あるデータを作成し、デスクトップに.xlsx形式で保存するマクロを作成 2 2023/03/02 18:54
- Visual Basic(VBA) vbaエクセルマクロについて あるデータを作成し、デスクトップに.xlsx形式で保存するマクロを作成 6 2023/03/03 18:05
- その他(プログラミング・Web制作) pythonのこのエラーがわかりません 3 2022/11/16 14:54
- 仕事術・業務効率化 頼まれてない事を自己判断でやることについて 1 2022/08/12 17:15
- その他(パソコン・スマホ・電化製品) A.I.D社のポータブルナビの地図更新について 1 2022/05/13 15:37
- Windows 10 Windows Updateが動作しません 7 2022/08/12 16:26
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
こちらはただの直列処理ですか?
-
PHPでこのコード自体に意味は無...
-
php 入力画面から確認表示画面...
-
PHP8を使うと、大量のWarningが...
-
アップロード画像数でCSSを分け...
-
PHPSpreadsheetを使って関数を...
-
phpでcookieがうまく保存されない
-
ワードプレスサイト PHP8.0.25...
-
入力フォームの空白や改行を制...
-
PHP一覧表示した項目にリンクを...
-
オススメのプログラミングスク...
-
PHPでのパスワード制限のセキュ...
-
htmlのエラーについて(デバッグ)
-
アマゾンのような評価の星を選...
-
SFTPなどは使わないホームペー...
-
ファイルアップロードに関して...
-
Q&Aサイトを作成していてURLの...
-
画像が表示出来ません。
-
phpでPEAR::DBを使っているので...
-
php 確認表示画面で値をSESSION...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
phpでcookieがうまく保存されない
-
index.phpに入るには、どうすれ...
-
PHP8を使うと、大量のWarningが...
-
PHPSpreadsheetを使って関数を...
-
重複を防ぐ記述について教えて...
-
index.phpって何ですか? 具体...
-
awsにApacheとPHPを入れて、何...
-
phpでPEAR::DBを使っているので...
-
php 確認表示画面で値をSESSION...
-
PHPでユーザー情報を入力して簡...
-
ワードプレスサイト PHP8.0.25...
-
php 完了画面の送信メールのコ...
-
SFTPなどは使わないホームペー...
-
PHPのセッション有効期限について
-
csvファイルについて教えて下さ...
-
PHPとHTML+Xamppの掲示板で画像...
-
PHPで訪問回数を表示するカウン...
-
ファイルアップロードに関して...
-
掲示板を作成しておりアップロ...
-
Q&Aサイトを作成していてURLの...
おすすめ情報