09/04/10 13:08:59
>>181
そういうこと
foreach (array_slice(foo(), 2) as $value) echo $value,"<br>\n";
fooは一度しか呼び出されないが、配列の数だけarray_sliceが動いてる
200:nobodyさん
09/04/10 13:11:00
>>194-195
参考になりました
ありっす
201:nobodyさん
09/04/10 13:14:39
>>199
マニュアルを読む限り、foreach が式をループ回数だけ評価するようには読めないんだけど。
っていうか、foreachが式が関数の場合に、関数は評価するが、その引数は評価しないとか、ありえんと思うが。
URLリンク(jp.php.net)
202:nobodyさん
09/04/10 13:16:50
さてベンチマークの俺の出番ですね
203:nobodyさん
09/04/10 13:19:31
>>202
お願いします。勇者!
204:nobodyさん
09/04/10 13:21:58
// テスト用変数
function testAry() {for($a=0;$a<1000;$a++) $h[]=$i;return $h;}
// タイム測定
function bench() {return microtime(true);}
// ベンチマーク表示
function cale($time) {
echo "<pre>";print_r($time);echo "</pre>";
foreach($time as $t) {echo "<p>".($t[1]-$t[0])."</p>";}
}
// --------- 比較コード ---------------- */
$time[0][0]=bench();
$test = array();
$h = array_slice(testAry(), 50);
foreach ($h as $v) $test[]=$v;
$time[0][1]=bench();
// ---------- 175のコード ------------- */
$time[1][0]=bench();
$test = array();
foreach (array_slice(testAry(), 50) as $v) $test[]=$v;
$time[1][1]=bench();
/* ---------- ここまで ---------------- */
cale($time);
205:nobodyさん
09/04/10 13:22:39
続き
テストした結果どちらもたいして変わらない
206:nobodyさん
09/04/10 13:28:45
結論からいえばforの中で関数は使うなってこと
207:nobodyさん
09/04/10 14:57:47
>>206
頭大丈夫か?
208:nobodyさん
09/04/10 15:08:18
>>207=>>175
ベンチマークみて行ってんならおまえ致傷だな
209:nobodyさん
09/04/10 15:08:50
メールを受け取ったらphpファイルを起動させようとしているのですが上手くいきません。
昨日から詰まってます。。。。助けてください。
.forwardのパーミッションは600。メールの転送ができることは確認済みです。
PHP 5.0.4 FedoraCore
.forwardの中身
"| /usr/bin/php -q /var/www/html/test2.php"
test2.phpは単体で動かせることは確認済みです。
メールを受け取った後、test2.phpが動いてる様子がありません。。。
210:nobodyさん
09/04/10 15:10:47
>>207ってID出さないスレで正規表現でたたかれてた人物じゃない?
これ以上触れるとこのスレ荒らされるぞw
211:nobodyさん
09/04/10 15:16:10
>>209
test2.phpに#!/usr/bin/phpみたいなパスは書いてあるよな?
212:nobodyさん
09/04/10 15:17:53
これでダメならまたおいで
.forwardの中身
"| /usr/bin/php /var/www/html/test2.php"
test2.phpの中身の一行目(パスは自分の環境にあわせてね)
#!/usr/bin/php -q
213:nobodyさん
09/04/10 15:18:37
>>212
あ、test2.phpのパーミッションは705か755にしろよ
214:nobodyさん
09/04/10 15:19:09
>>210
お前が荒らしてるんだよ頭大丈夫か?
215:nobodyさん
09/04/10 15:20:35
わざわざ配列のカウントを変数に入れたりしないから
PHPだけの糞仕様を広めないでください
まともな言語なら差は出ません
216:nobodyさん
09/04/10 15:20:55
>>210
貴様のせいでこのスレに正規表現クンが来たじゃないかww
責任とって>>175を始末しろよw
217:nobodyさん
09/04/10 15:23:22
215必死w
218:nobodyさん
09/04/10 15:24:05
俺はーラッパーwwwwwwwwww
バイトはスーパーwwwwwwwwwwwww
タッパに葉っぱwwwwwwwwwwwwwwww
詰め込む河童wwwwwwwwwwww
頭はテンパーwwwwwwwwwwww
パッパカパーwwwwwwwwwwwwwwwwww
219:nobodyさん
09/04/10 15:28:04
>>215
>まともな言語なら差は出ません
( ゚Д゚)ポカーン
220:nobodyさん
09/04/10 15:33:34
まともな言語というかコンパイラ言語なら差はでないだろうな。
JAVAやC#なんかからきたやつはforの中でlength書いてるだろうし、
PHPでも別にcountを中に書いてもいいよ。
速度ってもミリ秒の誤差程度だし別に気にする必要もない。
221:nobodyさん
09/04/10 15:35:33
>>211
入れてませんでした。
だけれど試して見ましたがダメでした。
>>212
変化ありませんでした。
パーミは705でやってます。
あまりにも解けなさすぎて吐き気が。。。
222:207
09/04/10 15:39:26
いや・・・俺が言いたかったのは
forの中で関数使うな
for () {
//ここで使うな
}
っていってるのかと思っただけなんだが
223:nobodyさん
09/04/10 15:41:31
>>221
まず、パイプ前なのか、パイプ後なのか切り分けろや
とりあえず、シェルスクリプトならうごくかどうかやってみ。
touch hoge とかでいいから
224:nobodyさん
09/04/10 15:47:08
>>221
"| /var/www/html/test2.php"
これでよしっと
225:nobodyさん
09/04/10 16:08:39
>>223
メールうけとったあとのシェルの動かし方がわからん。
shhogeというファイルを作ってtouch hogeを書き込む。
sh shhogeで空ファイルが書き込めることを確認してから
パーミを705に変更。
.forwardの中身を"| /var/www/html/shhoge" や
"| /var/www/html/sh shhoge"にしてみて、メールを受け取ってみたが
だめだった。
>>224
それは最初にやったお。
test2.phpに#!/usr/bin/phpつけてやってもだめだったお。
226:nobodyさん
09/04/10 16:10:46
一回再起動してもちつけ
227:nobodyさん
09/04/10 16:29:11
.forwardには来てるの?
228:nobodyさん
09/04/10 17:16:00
>>226
何か変えるごとにメール鯖を再起動してるお。
>>227
メールの転送はできてるお。
229:nobodyさん
09/04/10 17:20:06
PHPとは関係ない気がするが、メールサーバのローカル配送ログは確認した?
230:nobodyさん
09/04/10 17:24:58
/usr/bin/php が無かったりしないの?
231:nobodyさん
09/04/10 17:25:20
>>229
ごめんなさいお。疲れたのでたったいまVMwareを落としたとこだお。
夜風を浴びて飯食べたら、また来るお。
メールサーバのローカル配送ログは観方が判らなかったので
スルーしてたお。あとで確認するお。
232:nobodyさん
09/04/10 17:33:36
とりあえずその言葉使いはやめような
233:nobodyさん
09/04/10 18:00:19
質問させてください。
レンタルサーバでcronを使って、2chを定期的に監視するプログラムを作ろうと思うのですが、
公開されているプログラムなどありませんでしょうか?
スレ違いならすみません。
234:nobodyさん
09/04/10 18:01:57
キミが監視しなくてもすでに他の人が監視してるから大丈夫
235:nobodyさん
09/04/10 18:23:48
>>233
監視って具体的になにをするのね
236:233
09/04/10 18:44:10
>>235
とりあえず自分のブログに盛り上がっているスレのリンクと、
先頭数レスの表示をしようと思ってます。
237:nobodyさん
09/04/10 19:31:13
>>236
専ブラ作るために公開されてる仕様があるのでそれ嫁ができます
238:162
09/04/10 20:32:35 z5toBuCm
>>162 はやっぱりないですかね。
>>164
多分、質問の意味を理解されてません。
239:nobodyさん
09/04/10 20:35:19
flockしる
240:nobodyさん
09/04/10 20:38:07
>>239
flockとどういう関係が?
241:nobodyさん
09/04/10 20:46:12
一時的に利用するためのファイルの名前にこだわる理由がわからない
242:nobodyさん
09/04/10 20:48:58
>>238
まず、自分がどうやってるか書いたら?
良い方法は?って言われてもな。
一意な名前を取得する方法なんて腐るほどあるっしょ。
インデックスを保持するファイルを一つ作っといて、そこで一意を確保してからrenameするとか
すきなアルゴリズムにしたらいいよ
243:nobodyさん
09/04/10 20:56:57
>>233
URLリンク(akid.s17.xrea.com)
URLリンク(www9.atpages.jp)
244:nobodyさん
09/04/10 21:06:39
連番でいいよもう
245:nobodyさん
09/04/10 21:48:10
forの中で関数呼び出しはPHPに限らず大抵の言語でもパフォーマンスが落ちる。
コンパイラや実行環境が最適化してくれる場合もあるし、大した差がつかないのは事実だけどな。
初心者がやってたら理解していない可能性を考えて訂正するのは正しい姿勢だと思うが。
>194-196, >204
ベンチマーク取るにしては処理が短すぎる。
そのくらいだとPC内のほかのタスクとかがノイズになって意味のある数字が出ない。
1秒とか10秒とかの単位で時間がかかるような規模の試験をした方がいい。
246:nobodyさん
09/04/10 21:58:27
批判する前に自分もコードを出したらいいじゃん
247:209
09/04/10 22:19:41
ログを見ても原因らしい原因が判りません。。。。
.forward
"| /usr/bin/php /var/www/html/test2.php"
test2.php
#!/usr/bin/php -q
<?php
print "START";
system("touch hoge");
echo "end";
?>
maillog
postfix/smtpd[3703]: connect from atg-asm1.t-com.ne.jp[218.219.54.53]
postfix/smtpd[3703]: 2895E5DC486: client=atg-asm1.t-com.ne.jp[218.219.54.53]
postfix/cleanup[3707]: 2895E5DC486: message-id=<004a01c9b9de$15f7cf10$0701a8c0@XXXXXX551ed45>
postfix/qmgr[3669]: 2895E5DC486: from=<AAAAAAAAA@tba.t-com.ne.jp>, size=1594, nrcpt=1 (queue active)
postfix/smtpd[3703]: disconnect from atg-asm1.t-com.ne.jp[218.219.54.53]
postfix/local[3708]: 2895E5DC486: to=<YYYYYYYYYY@ZZZZZZZZ.homeip.net>, relay=local, delay=0, status=sent (delivered to command: /usr/bin/php /var/www/html/test2.php)
postfix/qmgr[3669]: 2895E5DC486: removed
248:nobodyさん
09/04/11 01:44:12
パフォーマンス云々よりも
count()っていうのはループ中に値が変わる可能性があるわけで
バグによってループする回数が変わってしまう危険性
っていうほうが避ける理由じゃないかな。。
249:nobodyさん
09/04/11 01:48:10
あと、上のほうにあったJavaScriptの話で
arr.lengthとfor(x in arr )を同じつもりで使うのは危ないよ。
例えばDOM使うと、forだと思ったとおりにならないときがあると思う。
250:nobodyさん
09/04/11 02:13:44 jaJ+Ur9l
httpヘッダのcontent-typeを取得したいのですが
送った、あるいは送る予定のheaderを取得するにはどうしたらいいですか?
251:nobodyさん
09/04/11 02:28:50
URLリンク(jp2.php.net)
252:nobodyさん
09/04/11 02:36:37
こんな関数あったんですね
ありがとうございました。
253:nobodyさん
09/04/11 02:55:15
headers_listって自分で設定したヘッダしか取得できないんですね
デフォルトで送る予定のContent-Type: text/http等は
決めうちで取得させるしかないですか?
254:nobodyさん
09/04/11 05:24:48 HAu5s/9P
ファイルアップロードに関する質問なのですが、
$_FILEのtypeは信用できないということを聞いたので、
別の方法で取得するようにしたのですが、
その他のname、size、errorなどは信用してもよいのでしょうか?
nameなどはエスケープ処理などする必要がありますか?
よろしくお願いします。
255:nobodyさん
09/04/11 05:49:24
>>247
それで、hogeは出来てないんだよね?
次はerror_log書いて、PHPのログをチェックかな
256:nobodyさん
09/04/11 06:24:24
>>245
>1秒とか10秒とかの単位で時間がかかるような規模の試験をした方がいい。
そこまで両者に差が出るとは思えないし
そんな結果が出るまでやるとなるとメモリが足りなくなるでは?
できるならぜひベンチ結果をみてみたいが
というかそんな規模のものPHPじゃ作らないだろうし杞憂な気もするけど・・・
>>248
>count()っていうのはループ中に値が変わる可能性があるわけで
>バグによってループする回数が変わってしまう危険性
だいたいこういう処理は配列を1つずつ取り出す場合に使うのであって
対象の配列数が変わるような処理をやるほうがおかしいのでは?
具体的にどのようなことをするのか検討もつかないけど・・・
バグによってループ回数が変わるっていうのも意味不明
>>183もナイワと批判を書くのではなくて
外におけばPHPではパフォーマンスがあがるという注釈をつければここまで伸びなかった
257:nobodyさん
09/04/11 06:53:18 /nX8neeQ
PDOのマニュアルには失敗した時の動作が、書かれてないんですが、
このあたりはドライバ依存ってことなんでしょうか?
URLリンク(jp.php.net)
URLリンク(jp.php.net)
例外で処理するのか戻り値で処理するのか、イマイチわかりません。
とりあえず、今使ってるSQLiteでは戻り値で判断できるみたいですが、ちょっと不安だなぁと言うことで。
258:nobodyさん
09/04/11 07:09:52
>>257
PDO用の例外があるでしょ
PDOExceptionだったかな
259:nobodyさん
09/04/11 07:17:24
>>257
失敗しても気にするなよ。諦めたらそこで試合終了だよ
260:nobodyさん
09/04/11 07:18:25
>>258
でたらめなSQL書いてqueryしても例外でないんですよ。
で、戻り値はfalse
ちなみに環境は PHP5.2.9 とWindows版にバンドル版されてるSQLite です。
261:nobodyさん
09/04/11 07:22:23 YDJbdlsq
基本的なことだと思うのですが、
<?php
$a .= "あ"
. "い"
. "う"
;
$b .= "あ";
$b .= "い";
$b .= "う";
echo $a."<br><br>".$b;
?>
の結果は同じになると思いますが、
少し複雑に変数やループ処理を入れたときに、
なぜか$aの方の"あ"の部分が消えてしまいます。
しかし、$b方式だと成功します。
>少し複雑に変数やループ処理を入れたときに、
を詳しく説明したいのですが、コードが長く、
まとめるにも上手く伝える術が見つかりませんでした。
簡易に説明すると、
データを参照して、何ページかを判断して、
リンク付きのページ番号をずらっと表示させるようなプログラム部分になるのですが、
どうして$aではできないのに$bだとできるのか疑問に思いました。
何か心当たりありましたらよろしくお願いします。
262:nobodyさん
09/04/11 07:25:34 YDJbdlsq
追記
ループ処理した$aを、
クラスの変数、private $a;
に格納していって、function get_a(){return $this->a;}
の、get_a()メソッドで参照したときに問題が起こりました。
phpは5.2.6です
263:nobodyさん
09/04/11 08:31:57
コードが長けりゃどこかにうpすればいいのに
264:247
09/04/11 09:40:31
>>255
error_logはsystemの戻り値の判定のところに書けばいいの?
265:nobodyさん
09/04/11 10:03:46
とりあえず、どこまで出来てるのか確認するのが基本
だから、<?phpの後でいいんじゃね?
266:247
09/04/11 10:37:14
エラーログを吐き出すようにしてみました。
単体でtest2.phpを動かすとログを出しますが、
メールを介して動かしてもログが吐き出されませんでした。
maillog
(delivered to command: /usr/bin/php /var/www/html/test2.php)
.forward
"| /usr/bin/php /var/www/html/test2.php"
test2.php
#!/usr/bin/php -q
<?php
error_log("テストエラー",0);
system("touch hoge");
?>
267:247
09/04/11 10:48:01
forwardでコマンドは実行されているみたいですがtest2.phpは動いていない。
・.forwardの中が間違っている。→/usr/bin/phpは存在する。
→/var/www/html/test2.phpでtest2.phpを
動かせる。
・パーミッションが間違っている。→.forwardを600 test2.phpを705or755
あと考えられる事象はなんでしょうか。
268:nobodyさん
09/04/11 11:22:57
>>267
ディストリは何使ってるんだ?
それがわかれば同じ環境作ってやってみるけど
269:nobodyさん
09/04/11 11:32:38
>>267
.forward
"| /usr/bin/php -q /var/www/html/test2.php"
にしてみ
270:nobodyさん
09/04/11 11:35:55
.forward
"| /var/www/html/test2.php"
うちは、これで動くけど?
271:nobodyさん
09/04/11 11:59:26
まず
"| touch /tmp/hoge"
ってやってみて処理してるユーザ名を把握してはどうだろう
272:247
09/04/11 12:15:02
>>267
ディストリというのは環境という意味でいいのかな?
PHP 5.0.4kfedoracore4です。
>>269
>>270
試してみました。
>>271
suxxxxxxxのユーザーの空ファイルとなりました。
……test2.phpはroot。……まさか。。。
273:261
09/04/11 12:15:24 YDJbdlsq
ありがとうございます
自己解決しました。
実際は、
$a .= "あ"
. $i+1
. "う"
;
という風に、”い”の部分は計算式をいろいろと入れていたのですが、
その計算式を()でくくって
$a .= "あ"
. ($i+1)
. "う"
;
のようにしたら、できました。
274:247
09/04/11 12:23:05
>>271
作成されたファイルhoge
-rw------- 1 suXXXXXXX suXXXXXX 0 4月 11 08:36 hoge
.forward
-rw------- 1 suXXXXXXX suXXXXXXX 20 4月 11 08:35 .forward
test2.php
-rwx---r-x 1 root root 112 4月 11 08:02 test2.php
ごく。
275:nobodyさん
09/04/11 12:35:09 jPW674z3
グローバル変数はまったく使わないほうがいいのでしょうか?
276:nobodyさん
09/04/11 12:43:26
うん
スーパーグローバルは使うけど
277:nobodyさん
09/04/11 13:12:41
スーパーグローバルは便利だが、テストしにくくなる。
モジュールごと、クラスごとにテストを書かないといけないような、ややっこしいコードを作る時は避けた方がいい。
グローバル変数は使うべきではない、とされている。
これは、グローバル変数はどこでどう値が変えられるか分からないのが最大の理由。
ある時点でグローバルに何が入っているかは、プログラムの最初から最後まで全部読まないと分からない。
不具合発生時に原因を特定しづらいし、機能追加時などにどの時点でどの変数がどうなってるか分かりづらくなる。
いっぽう、一時変数は、その関数の中で生成され、その関数が終わったら消えるので、その関数の中だけ見れば値が分かる。
グローバルに依存しない関数は、同じ引数を渡せば同じ結果が常に返って来る。
プログラムのどこで呼ばれても(引数が同じならば)同じ結果が返る事が保証されているので、バグの原因を探しやすい。
278:247
09/04/11 14:11:26
ディレクトリィのパーミッションを777に変えてたら
test2.phpまで届いてログが出るようになりました。
ですが、system("touch hoge")が実行されず
まだ空ファイルが作られない状態です。
279:nobodyさん
09/04/11 14:16:55
file_put_contents("/tmp/hoge.txt", realpath("."));を書いてみて、
カレントディレクトリを把握してはどうだろう。そしたらパーミッションを確認してと・・