トップページ⇒php
1001コメント284KB

【PHP】下らねぇ質問はID出して書き込みやがれ 103

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2011/01/25(火) 20:46:58ID:???
質問者はまず>>1を良く読むこと(必須!)
過去スレ、関連スレ、FAQなどは>>2-10辺り
次スレは>>980が立てる。10分以内に立たない場合、宣言してから立てたい人が立てること。

◆前スレ
【PHP】下らねぇ質問はID出して書き込みやがれ 102
http://hibari.2ch.net/test/read.cgi/php/1292670453/
◆質問用テンプレ
【OS名】CentOS
【PHPのバージョン】5.3
【連携ソフトウェア】MySQL ImageMagick
【質問内容】

◆質問する時の注意
・ 出来るだけスレを上げて自分のIDを表示させること。(メール欄に何も記述しない。専ブラのsageチェックを外す)
・IDを出さない場合、偽者や成りすましの出現を覚悟すること。
・ 己の行った操作、変更などを詳しく明記すること。
・ エラーメッセージはそのまま表記すること。「エラーが出ます」だけでは回答不可。
・ 質問者として、態度をわきまえること。
・ 事前に関連リンクの公式マニュアル、リファレンス本くらいはちゃんと目を通しておくこと。
(PHPで最良の教本はこの公式マニュアル。市販の書籍は嘘が多いので鵜呑みにしない。)

◆質問後の注意
・2回目以降は最初に質問した際のレス番号を入れて、偽者防止に極力IDを表示させること。
・解決しなくても回答をもらった場合はお礼を言うこと。
 (荒らし、煽りは除く。煽られたときも、無闇に反論せずスルーすること。)

◆回答者への注意
・誰にレスしているのか分からないと困るので、>>(アンカー)をつけて回答すること。

【その他諸注意】
・SQL・正規表現・PEAR・テンプレート(Smarty等)・フレームワークは各該当スレへ
0494nobodyさん2011/02/05(土) 11:29:58ID:???
http://ponpare.jp/uw/uwp1101/uwt1101init.do?code=0003076&areaId=57
0495nobodyさん2011/02/05(土) 11:31:13ID:???
>>491
strip_tagsは完璧に動作してくれると限らないので俺はstr_replaceを勧める
0496nobodyさん2011/02/05(土) 11:39:20ID:???
せめてstr_ireplaceを勧めてやれや
0497nobodyさん2011/02/05(土) 13:25:54ID:???
>>491
俺も>>493が正解だと思うぞ
04984912011/02/05(土) 13:40:19ID:QxaE9H+B
みなさん、どうもありがとうございます。

$items = "麻布十番・名物スタンドの<br>「高級和牛の";
$items = strip_tags($items);
var_dump($items);

テストでこのようにすると普通にタグは削除されるのですが、
実際にプログラムの中でapiでxmlから抜き出した文字列になぜかstrip_tagsが効かないのです。

str_replaceなどでも同様でした。
mb_convert_encoding($str, "UTF-8", "auto");などで文字コード変換してから、
strip_tags使っても上手くいかず。。

もしかすると、cakephpでxmlを抽出するクラスを使っているので文字列が通常と変わっているのかも。
下記のようにデータを抽出しています。

$url = 'http://ws.ponpare.jp/ws/wsp0100/Wst0201Action.do?key=sample&large_area=1';
uses('Xml');
$items = new XML($url); //make xml content into object
$items = Set::reverse($items); //xml to array
$items = $items['Results']['Ticket'];

foreach($items as $item){
$item['title'] = strip_tags($item['catchcopy']);
}
04994912011/02/05(土) 13:48:33ID:QxaE9H+B
json形式で出力しても strip_tagsが効かなかったので、
xmlの問題ではないみたいです。。

うーむ、ハマりにハマっている。
0500nobodyさん2011/02/05(土) 13:51:18ID:???
>>498
$itemで出力しているのはオブジェクトではなくて文字列になっているか確認しましょう
今すぐstrip_tagsの使用をやめましょう
strip_tagsの利用は初心者までです
strip_tagsを推奨しているサイトや参考書は今すぐ記憶から消し去りましょう

警告
・strip_tags() は HTML の検証を行わないため、 不完全または壊れたタグにより予想以上に多くのテキスト/データが削除される可能性があります。
・この関数は、allowable_tags で許可した全てのタグの属性を修正しません。 これには、style および onmouseover属性が含まれており、 悪意のあるユーザが他のユーザに見せるようなテキストを投稿する際に危険な行為を行う可能性があります。


05014912011/02/05(土) 13:58:28ID:QxaE9H+B
普通のphpでハマっている部分を再現できるスクリプトは以下の通りです。
strip_tagsが効かないのが分かると思います。

$url = 'http://ws.ponpare.jp/ws/wsp0100/Wst0201Action.do?key=sample&format=json&large_area=3';
$items = file_get_contents($url);
$items = json_decode($items, true);
$items = $items['results']['ticket'];

foreach($items as $item){
$item['title'] = strip_tags($item['catchcopy']);
echo $item['title'];
}
05024912011/02/05(土) 13:59:47ID:QxaE9H+B
>>500

レスありがとうございます。
オブジェクトになってないか、var_dumpしてみたのですが、見た感じ
オブジェクトではないと思うのです。

str_ireplaceとかを使うほうが安全なのですね。
0503nobodyさん2011/02/05(土) 14:07:38ID:???
>>501
そのJSONにはタグは含まれていない
HTMLの文字実態参照で表したタグらしきものなら見受けられるが
0504nobodyさん2011/02/05(土) 14:13:14ID:???
foreach($items as $item){
/*@*/var_dump($item['catchcopy']);
$item['title'] = strip_tags($item['catchcopy']);
echo $item['title'];
}

strip_tags する対象を確認して結果をお知らせください。
05054912011/02/05(土) 14:13:43ID:QxaE9H+B
>>503

レスありがとうございます。
下記のようなタイトルから、 <br> を削除したいのですが、これはタグと認識されてないから
関数が効かないということでしょうか?

[catchcopy] => 高級鮨に加え、すき焼き&しゃぶしゃぶも食べ放題90分!<br>飲み放題もついてくる!<br>“極上生鮨コース”7,300円を驚きの54%オフ3,300円でどうぞ♪
05064912011/02/05(土) 14:16:04ID:QxaE9H+B
>>504

レスありがとうございます。

string(182) "海の幸も山の幸も♪<br>「北海道産食材にこだわる濃厚塩ちゃんこ鍋コース」<br>刺身6点盛りも付いた全6品、5,500円が2,500円に!"

var_dumpしてみたところ、上記のような結果になりました。
0507nobodyさん2011/02/05(土) 14:27:18ID:???
>>506
ブラウザ上じゃなくてソース表示で確認してみ?
こうなってると思うぞ。

string(182) "海の幸も山の幸も♪<br>「北海道産食材にこだわる濃厚塩ちゃんこ鍋コース」<br>刺身6点盛りも付いた全6品、5,500円が2,500円に!"

<br> じゃタグとして認識されるわけねぇよなぁ
0508nobodyさん2011/02/05(土) 14:28:39ID:???
悪い、<br>じゃなくて&lt;br&gt;(&は半角)な。

海の幸も山の幸も♪&lt;br&gt;「北海道産食材にこだわる濃厚塩ちゃんこ鍋コース」&lt;br&gt;刺身6点盛りも付いた全6品、5,500円が2,500円に!
0509nobodyさん2011/02/05(土) 14:29:37ID:???
>>505
2chの仕様で変換されてるか知らないが
$item['catchcopy'] には <br> じゃなくて &lt;br&gt; が入ってる
これを取り除きたかったら
preg_replace('/&lt;.+?&gt;/', '', $item['catchcopy']);
0510nobodyさん2011/02/05(土) 14:32:50ID:???
>> foreach($items as $item) {

これが実行された時点で、$item は文字列になっているはず。
その文字列から、 $item['catchcopy'] で値を取り出せるのですか?

05114912011/02/05(土) 14:35:22ID:QxaE9H+B
>>507-509

おおーーーー!!
ありがとうございます!! 上手くいきました!

これだけで2時間以上ハマっていたので感動です。
本当に助かりました。
0512nobodyさん2011/02/05(土) 14:37:12ID:???
>>510
$item は文字列にならないから。
0513nobodyさん2011/02/05(土) 14:43:29ID:???
>>510
foreach について誤解しているな。このコードで理解できるよね?

<?php
{
 $hoge[ 0 ] = array( "catchcopy" => "hoget-0" );
 $hoge[ 1 ] = array( "catchcopy" => "hoget-1" );
 $hoge[ 2 ] = array( "catchcopy" => "hoget-2" );
 $hoge[ 3 ] = array( "catchcopy" => "hoget-3" );
 //
 var_dump( $hoge );
 //
 foreach( $hoge as $item ) {
  var_dump( $item );
 }
}
?>
0514nobodyさん2011/02/05(土) 14:44:44ID:???
>>513 許してやれ くだらない質問にくだらない知識で応えただけなんだから。
0515nobodyさん2011/02/05(土) 14:53:07ID:???
>>513
馬鹿にしないでください。
あなたの提示した例と今回の実例とは全く異なりますので説明になっていません。
0516nobodyさん2011/02/05(土) 14:54:17ID:???
けんかしてる けんかしてる
0517nobodyさん2011/02/05(土) 15:42:26ID:???
1つだけハッキリしているのは ID:QxaE9H+B は想像力が無いし向いていないと思う
0518nobodyさん2011/02/05(土) 15:46:48ID:???
ばかにしてる ばかにしてる
0519nobodyさん2011/02/05(土) 15:53:41ID:???
&amp;
05205102011/02/05(土) 18:29:38ID:???
自己解決しました
本当使えない連中ですね
0521nobodyさん2011/02/05(土) 18:37:58ID:???
使えなくてすいません ほんとすいません
0522nobodyさん2011/02/05(土) 18:39:38ID:???
>>520
素晴らしい
誰も気付かなかった原因を発見するなんて貴方は天才です
0523nobodyさん2011/02/05(土) 22:52:42ID:???
>>520
ID出せやゴルァ
0524nobodyさん2011/02/06(日) 00:07:05ID:???
>>523
下品ですね。教養が無いのが丸わかりですよ。
0525nobodyさん2011/02/06(日) 00:13:45ID:???
Vertrigoとxamppどっちがいいですか?
0526nobodyさん2011/02/06(日) 00:49:02ID:???
好きなほう
0527nobodyさん2011/02/06(日) 01:19:10ID:???
どっちも駄目。時代はAjax。
0528nobodyさん2011/02/06(日) 01:27:20ID:???
>>527 巣に帰りなさい
【PHP】下らねぇ質問はID出さずに書き込みやがれ 1
http://hibari.2ch.net/test/read.cgi/php/1289117484/l50

0529nobodyさん2011/02/06(日) 03:21:00ID:???
>>528
>>461
0530nobodyさん2011/02/06(日) 03:57:06ID:RrdA9rdH
趣味でPHPを勉強して、じゃんけんゲームを作ろうとしてます。
HTMLでフォームを作ってラジオボタンのvalue値に1(グー),2(チョキ),3(パー)
を設定し、PHP側でPCが出す手を以下のようにして、設定してます。
$pc_hand[1] = "グー";
$pc_hand[2] = "チョキ";
$pc_hand[3] = "パー";
$r = time()%3;
$pc_hand[r]
とやってます。問題なのは、pc_handの出した手とユーザーが選んだ手の勝敗を
どう判定すればいいのかわからないというところです。
日本語が少しおかしいですが、PHP初心者なので何卒お力を貸してください
0531nobodyさん2011/02/06(日) 04:35:28ID:???
>>530
そもそもPHPでやることじゃない
JSで作ればいい
古い携帯向けってなら仕方ないが
じゃんけんなんて調べればいくらでもでてくるだろ
乱数はtime()%3じゃなくmt_rand()使え

$jankenMap = array(
0 => 'グー',
1 => 'チョキ',
2 => 'パー'
);

$usr = $_POST['usr'];
$com = mt_rand(0, 2);

printf('usr: %s, com: %s<br/>', $jankenMap[$usr], $jankenMap[$com]);

$ret = ($usr - $com + 3) % 3;

switch ($ret) {
case 0: echo 'あいこ'; break;
case 1: echo 'usrの負け'; break;
case 2: echo 'usrの勝ち'; break;
}

じゃんけん程度のマップならif文でいいが
もっと手が増えたゲームならビット演算すればいい
確認してないから知らん
0532nobodyさん2011/02/06(日) 04:51:23ID:???
$ret = ($usr - $com + 3) % 3;
俺にはこういうのが思いつけない
0533nobodyさん2011/02/06(日) 04:55:40ID:???
>>532
数学が苦手な奴がプログラムすんな、って話だな。
0534nobodyさん2011/02/06(日) 05:04:16ID:RrdA9rdH
$ret = ($usr - $com + 3) % 3
質問させていただいたものです。
なぜ、3を加算し、その後で3で割った剰余をとるのでしょうか?
0535nobodyさん2011/02/06(日) 06:13:18ID:???
俺は>>531じゃないけど、3を足さないと結果が負の値になったりするでしょ。
$usr:0〜2 なのを +3 して $usr:3〜5 にしておく。
そこから $com:0〜2 を引いてmod3を求めれば必ず0〜2の範囲に収まるよね。
まぁ他にも色々方法はあるだろうけど。
0536nobodyさん2011/02/06(日) 06:17:31ID:???
一番の問題は、XSS可能なこと
0537nobodyさん2011/02/06(日) 06:38:12ID:???
ちなみに補足すると、負の数の剰余算は数学的には定義によって異なり、
-1 mod 3 の計算結果は-1もしくは2になる。
PHPで -1 % 3 を計算すると結果は -1 になる。(Perlとかだと2かも)
なので3を加算してからmod3すれば希望する結果が得られる。

例えば、
usr:0(グー) com:1(チョキ)→ (0-1+3)%3=2(usrの勝ち)
usr:1(チョキ) com:0(グー)→ (1-0+3)%3=1(usrの負け)
05385312011/02/06(日) 07:33:08ID:???
>>534,537
補足サンクス
その通りの考えだったわけ

>>536
XSSはできなくもないけど配列のキーだから何もしなかった
$jankenMap[$_POST['usr']] がNOTICE出す程度で
array_key_exists あたりで調べればいいんじゃない
05395312011/02/06(日) 07:35:17ID:???
アンカミス >>535 補足サンクス
0540nobodyさん2011/02/06(日) 10:22:01ID:sg+1m/iV
何で符号が付くとXSSの可能性があるのか詳しく教えてください
0541nobodyさん2011/02/06(日) 10:42:37ID:???
符号って?
今回の例ならXSSの心配は無いでしょ。
不安なら
$usr = $_POST['usr'] + 0;
とか
if($usr < 0 || $usr > 2) $usr = 0;
とでもしておけばいい。
0542nobodyさん2011/02/06(日) 10:45:07ID:W4hAX9yk
>>507-508 にあるように、

海の幸も山の幸も♪&lt;br&gt;「北海道産食材にこだわる濃厚塩ちゃんこ鍋コース」&lt;br&gt;刺身6点盛りも付いた全6品、5,500円が2,500円に!

といった、lt;br&gtの表示が見えるようにソース表示をするのはどうやればできるのでしょうか?

できればブラウザで見たいなと思っているのですが、htmlspecialcharsの反対をするような関数を
探しているのですが勘違いしているような気もします。

アドバイスいただければm(_ _)m
0543nobodyさん2011/02/06(日) 10:46:04ID:???
&を&に変換すればいいよ
0544nobodyさん2011/02/06(日) 10:52:17ID:sg+1m/iV
符号は+や-の事だと思ってましたけど違いましたっけ?
ここ見てこう書いてあったもので・・・
ttp://d.hatena.ne.jp/keyword/%C9%E4%B9%E6

>>536と>>538でXSS可能と書かれてますがマイナス記号でXSS出来るのは初めて聞いたので本当に可能なのか知りたいわけです
0545nobodyさん2011/02/06(日) 11:04:08ID:???
>>544
いやだからさ、「マイナス記号でXSS出来る」なんてどこに書いてあるんだよ
0546nobodyさん2011/02/06(日) 11:12:30ID:???
>>542
普通にブラウザでソースを表示すればいいじゃん。
ブラウザ上で確認のために&gt;ってそのまま表示させたいのなら
echo(htmlspecialchars($item['catchcopy']));
0547nobodyさん2011/02/06(日) 11:18:56ID:sg+1m/iV
すみません勘違いしてました
今再現できましたが531氏のスクリプトではエラーが表示されるサイトではXSSになりますね
0548nobodyさん2011/02/06(日) 11:20:38ID:???
>>547
ならねぇだろ。>>531のソースでどうやってXSSすんだよ。
0549nobodyさん2011/02/06(日) 11:25:19ID:???
ああそのレスで初心者だったのかあなた
サーバでエラーが表示できる環境でXSSを引き起こすコード書けば簡単に再現できますよ
0550nobodyさん2011/02/06(日) 11:27:53ID:???
> エラーが表示されるサイトではXSS

なにをXSSと言うかの基準が人それぞれだと言う議論ですか?

こうした書き込みも質問だと受け取られてIDを出せと言われるんですか?

0551nobodyさん2011/02/06(日) 11:29:00ID:???
横からレスするが>>548ってXSS分かってないだろw
0552nobodyさん2011/02/06(日) 11:29:18ID:???
>>549
あのな。話が食い違ってんの。
>>531はじゃんけんの勝敗判定のアルゴリズムの説明してるだけで
XSSとか考慮してないだけだろ?
_POSTの処理のXSS対策とかは>>541に書いたように自分で勝手にやれ、って話。
0553nobodyさん2011/02/06(日) 11:34:22ID:???
だからAjaxでやれと何度も
0554nobodyさん2011/02/06(日) 11:41:21ID:???
自作自演に付き合う連中が多いわ
お前ら親切だなw
0555nobodyさん2011/02/06(日) 11:44:01ID:W4hAX9yk
>>546
レスありがとうございます。

$url = 'http://allcoupon.jp/api-v1/coupon?output=json';
$items = file_get_contents($url);
$items = json_decode($items, true);
echo '<pre>';
var_dump($items);
echo '</pre>';

上記のリクエストで表示される、366番目のクーポンのタイトルでは、
下記のように改行されてしまっています。この改行をなくしたいです。

["coupon_title"]=>
string(173) "【東京23区内出張】独身から主婦まで!
『家事代行』「月4回のファーストプラン+交通費4回分」
通常52,000円が62%OFFの19,800円!"

そこで、ソース表示するために、下記を試しましたが改行ソースが見れないのです。。

$url = 'http://allcoupon.jp/api-v1/coupon?output=json';
$items = file_get_contents($url);
$items = json_decode($items, true);
foreach($items as $item){
echo(htmlspecialchars($item['coupon_title']));
//echo $title;
}
0556nobodyさん2011/02/06(日) 11:44:31ID:???
XSSを覚えたてのやつがキャンキャン騒いでるだけ
0557nobodyさん2011/02/06(日) 11:53:01ID:???
XSSを知らない無知を叩くとこうも荒れるものだ
おもしれぇwwwwwwwwwwwwww
0558nobodyさん2011/02/06(日) 11:55:29ID:???
その改行の話も前に親切な人が教えてくれただろ、
聞く気が無いなら巣に帰れ
0559nobodyさん2011/02/06(日) 11:58:06ID:???
>>555
元々のデータがそこで改行されてるからでしょ。
つまり、<br>が入ってるのではなく、文字列中に改行コードが入ってるってこと。
echo(htmlspecialchars(preg_replace('/[\n\r]/', '', $item['coupon_title'])));
0560nobodyさん2011/02/06(日) 11:59:06ID:???
str_replace(array("\r\n","\r","\n"), "", 文字列)
0561nobodyさん2011/02/06(日) 12:00:47ID:???
おっと、今度はpreg_replace派とstr_replace派の争いか?www
0562nobodyさん2011/02/06(日) 12:07:27ID:???
>>550
XSSに基準ってあんのか?
0563nobodyさん2011/02/06(日) 12:11:29ID:???
なんかXSS厨がうるさい日だな
さんざん既出なんだから気になるなら過去ログでも漁れよ
0564nobodyさん2011/02/06(日) 12:15:47ID:???
なんか過去ログ厨がうるさい日だな
0565nobodyさん2011/02/06(日) 12:18:00ID:???
Ajax厨vs過去ログ厨ってことか。
0566nobodyさん2011/02/06(日) 12:22:52ID:W4hAX9yk
>>559-560

ありがとうございます!無事困っていた改行の問題が解決できました!

しかし、結局、 \n といった改行コードを表示させて、今後、同じような問題に
ぶち当たった時になにを変換したらいいかを調べられない状況です。


echo(htmlspecialchars(preg_replace('/[\n\r]/', '', $item['coupon_title'])));  で確認すると

【東京23区内出張】独身から主婦まで!『家事代行』「月4回のファーストプラン+交通費4回分」通常52,000円が62%OFFの19,800円!

と表示されて、 \n などの改行コードを調べられないのです。。

0567nobodyさん2011/02/06(日) 12:24:37ID:???
>>566
いや、結局何をしたいのかよくわからないんだけど。
0568nobodyさん2011/02/06(日) 12:37:32ID:???
>>566
改行コードが入っているのを確認したいということなら、
echo(htmlspecialchars(str_replace(array("\r\n","\r","\n"), array('\r\n','\r','\n'), $item['coupon_title'])));
とか。(ただし表示されるのはあくまで'\r\n'等という「文字列」であって、改行コードではないことに注意)
0569nobodyさん2011/02/06(日) 12:38:11ID:W4hAX9yk
>>567

わかりにくくて申し訳ないです。

改行を修正するという問題はやり方を教えていただいて解決したのですが、
改行に使われているコードをソース表示で目視して、しっかりとソースを確認できるようになりたいのです。

例えば、 \n\r で改行されているのか、&lt;br&gt だとか、自分で確認できれば今後、自力で変換する
ことができるだろうと思いまして。
0570nobodyさん2011/02/06(日) 12:42:36ID:???
>>569
改行コードは目で見えないから擬似的に確認するなら>>568みたいな方法しかないね。
でも文字として画面に表示されない文字コードは他にもたくさんあるから
どうしても気になるなら1文字ずつ文字コードを確認するしかないね。
0571nobodyさん2011/02/06(日) 12:52:59ID:???
そんなのソース表示するかheaderでtext/plainを送信するかしないと無理だろ
0572nobodyさん2011/02/06(日) 12:53:45ID:W4hAX9yk
>>568 >>570

なるほど。どうもありがとうございます。

今回はこのスレで、改行されているのであれば、 \n\r を変換だとか &lt;br&gt を変換だろうと
教えてもらいましたが、ソース表示で確認するのは困難なので、予測してやるしかないのですね。

勉強になりましたm(_ _)m
0573nobodyさん2011/02/06(日) 13:00:51ID:???
>>572
ちなみに[\n\r]って書いたけど、普通はCR+LFだから\r\nの順ね。
システムによっては\rだけとか\nだけ(Linux等)なんかもあるからね。
0574nobodyさん2011/02/06(日) 13:01:13ID:???
>>572
バイナリが確認できるエディタぐらいは用意しなよ

<?php
header('Content-Type: text/plain;');
$data = file_get_contents('http://www.example.com');
for ($pos = 0, $length = strlen($data); $pos < $length; $pos += 16) {
    $line = substr($data, $pos, 16);
    printf("%08X : %s : %s\r\n", $pos, implode(' ', str_split(bin2hex($line), 2)), $line);
}
0575nobodyさん2011/02/06(日) 13:16:57ID:???
いいね、それ
0576nobodyさん2011/02/06(日) 13:58:32ID:???
>>542
htmlspecialchars_decode
0577nobodyさん2011/02/06(日) 14:33:00ID:Zx7Z1+IF
配列Aの末尾5件を取り出して配列Bに入れたいんだけど
このとき取り出した5件も配列Aから取り除きたい。

この分割を一度に出来る関数は用意されてないですか?

配列B = array_slice(配列A, -5, 5);
array_splice(配列A, -5, 5);

ってやるしかない??
0578nobodyさん2011/02/06(日) 14:37:00ID:???
>>577
返り値
0579nobodyさん2011/02/06(日) 14:45:05ID:???
>>577

function orijinaru() {
配列B = array_slice(配列A, -5, 5);
array_splice(配列A, -5, 5);
}

0580nobodyさん2011/02/06(日) 14:51:38ID:???
ああ、array_spliceで削除した配列は返り値にあるのか。
トンクス
0581nobodyさん2011/02/06(日) 15:36:47ID:5gbalayA
(毎日yyyymmdd.txtにアクセスログを取り、)日付が変わって最初にindex.phpにアクセスがあった時、
yyyymmdd.txt(以下、日付は前日のものになります)を処理して、yyyymmdd.htmlを出力する、というものを作りたいです。

まずyyyymmdd.htmlが存在するか確認し、あればそのまま表示、なければ処理をするのですが、
普通にyyyymmdd.txtをファイルロックするだけだと、ロック中にアクセスしてきた人は
ロックが解除された後同じ処理をすることになり、無駄が出ます。
「ファイルがロックされていなかったら処理Aをする。ロックされていたら、解除を待った上で処理Bをする」
にはどうしたらよいでしょうか?
0582nobodyさん2011/02/06(日) 15:43:43ID:RrdA9rdH
530です。
質問に答えていただいた方々ありがとうございます。
また質問させてもらうかと思いますがよろしくお願いします。
0583nobodyさん2011/02/06(日) 15:49:31ID:???
>>581
try〜catch
0584nobodyさん2011/02/06(日) 16:53:00ID:???
> ロック中にアクセスしてきた人は、ロックが解除された後同じ処理をすることになり、無駄が出ます。

何がどの様にどれだけ無駄になるのかを知りたい。

100万人が同時にアクセスして、100万−1回の無駄が出てしまうのだろうか?
0585nobodyさん2011/02/06(日) 17:07:29ID:???
yyyymmdd.txt をロックするよりも、yyyymmdd.htmlをロックすれば?
0586nobodyさん2011/02/06(日) 17:26:05ID:???
ロック用としてもう1ファイルorディレクトリ必要だな
05875812011/02/06(日) 17:33:24ID:5gbalayA
>>583
試してみます。

>>584
おっしゃるとおりです。
処理が終わるのを待てば100万人がアクセスしても処理は1回で済みます。
(最も、PHP初心者が細かいことまで気にする必要があるのかわかりませんが・・・)

>>585
処理する前にhtmlを作成してロックしておくということでしょうか。

>>586
その方法はよく見かけますね。
試してみます。
0588nobodyさん2011/02/06(日) 17:35:55ID:???
ロックディレクトリは使うな
0589nobodyさん2011/02/06(日) 17:40:11ID:???
>>588
なんで?
05905812011/02/06(日) 17:43:45ID:5gbalayA
>>588
削除に失敗したら解除されなくなってしまうんでしたっけ。

すみません。
ロック(が解除されて、自分が)した後にもう一回.htmlの存在を確認すればできそうですね。
二回確認するのが無駄な気もしますが、やはり初心者が気にするようなことではないですかね。
0591nobodyさん2011/02/06(日) 17:45:54ID:???
ttp://www.tohoho-web.com/wwwcgi8.htm
0592nobodyさん2011/02/06(日) 17:53:11ID:???
PHPで完全にアトミックなのはmkdirだけどな
少しくらいこぼれてもいいならtmpファイルとかflock使えばいい
ディレクトリロックは完璧に作れば排他処理ができるが初心者がいきなりできるもんじゃない
0593nobodyさん2011/02/06(日) 17:57:32ID:zdEuJ7Gl
php.iniでxdebugの設定はhttp://www.xdebug.org/のどのページにかいてあるか教えて下さい
■ このスレッドは過去ログ倉庫に格納されています