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

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

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

◆前スレ
【PHP】下らねぇ質問はID出して書き込みやがれ 83
http://pc11.2ch.net/test/read.cgi/php/1238958898/

◆質問用テンプレ
【OS名】vine linux
【PHPのバージョン】php5.26
【連携ソフトウェア】mysql
【質問内容】

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

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

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

【その他諸注意】
・SQL・正規表現・PEAR・テンプレート(Smarty等)・フレームワークは各該当スレへ
0726nobodyさん2009/06/03(水) 14:34:20ID:???
見てはいけない暗部を見た気がする
0727nobodyさん2009/06/03(水) 14:49:50ID:???
documentRootの下にwwwってどういうこっちゃ?
0728nobodyさん2009/06/03(水) 14:52:55ID:???
例えるなら、実際には /var/www/html がDocumentRootで、本来は /var/www/Zend
0729nobodyさん2009/06/03(水) 14:56:04ID:???
途中で送信しちまった。

例えるなら、実際には /var/www/html がDocumentRootで、今まで /var/www/Zend を相対で指定してたのを
絶対パスにしようとして何を思ったか /www/Zend を指定してたってことでしょ。
0730nobodyさん2009/06/03(水) 14:58:29ID:???
711はDocumentRoot [/var/www/html] の下に [/www/Zend] を作成してZFを入れていたってこと?

てかZendディレクトリってZF自体のコンポーネントが入っているディレクトリ?
そこに画像保存フォルダを作成?
ワケワカメ
0731nobodyさん2009/06/03(水) 14:59:22ID:???
>>729
「documentRoot + /www/Zend」で解決したって言ってるんだから違うんでないの?
0732nobodyさん2009/06/03(水) 15:01:32ID:???
しらねーよ。単にヒントになったってだけで実際にその通りやって解決したかもわかんねーし。
俺は>>719見て>>729書いただけだ。
0733nobodyさん2009/06/03(水) 15:10:32ID:???
いやその下の725くらい見ろよw
0734nobodyさん2009/06/03(水) 15:12:47ID:???
だからな、>>725見たって引用されてるってだけで「実際にその通りにして解決したかどうか」
なんてわかんねーだろつってんの。アンカーも貼れない素人は半年ROMってろヴォケ
0735nobodyさん2009/06/03(水) 15:18:25ID:uN/QnhGZ
PHPから別サーバーにHTTPリクエストを投げたいのですが
その際、レスポンスを待たずに、先のスクリプトを実行したいと思います。
レスポンスは必要なくなるべく早く先の処理を続けたいのです。

そんな関数はありますか?

javascriptで自鯖にあるPHPをAjaxで呼んで、そのPHPで
file_get_contents('~~);
すれば、ページをすぐ返せそうなきはしますが、PHPだけで出来たら楽かなとおもいまして
また、その方法だとページを閉じるタイミングによって、起動しない確立も少しはあるかなと。

お願いします。
0736nobodyさん2009/06/03(水) 15:27:53ID:???
タシロ砲か
0737nobodyさん2009/06/03(水) 15:40:17ID:???
>>735
接続するために最初のレスポンスは受け取らないといけんと思うけど、
fsockopenとかでソケット通信するのが速度的に速いんじゃない?
0738nobodyくん2009/06/03(水) 15:44:21ID:YYq96a9O
PHPで作られたオープンソースなどを読解しているのですが
どこで関数が定義されているか調べながらお菓子を食べているんです。

お菓子を集中して食べるためにはどうしても'どこで'関数が定義されているか
探さない方法ってあると思うんですけど

みなさん何か方法があれば教えてほしいものです。
0739nobodyさん2009/06/03(水) 15:59:16ID:???
おかしを食べると
あっ ここおかしいな
なるほど おかしい理由が分かったなどのメリットがある
0740nobodyさん2009/06/03(水) 16:01:19ID:???
grepでいいじゃん
0741nobodyくん2009/06/03(水) 16:05:27ID:YYq96a9O
自分・・・かなり怒っています。

0742nobodyさん2009/06/03(水) 16:09:17ID:???
grepでtagファイル作ってエディタでジャンプ
それも面倒ならEclipseやNetBeansにプラグインでも入れて使えばいいと思うよ。
0743nobodyさん2009/06/03(水) 16:18:40ID:???
>>734
おめー自閉症の疑いがあるぞ
普通は引用して解決したとか知らなかったとか書いている場合はそれが解決要因だったというニュアンスになるんだよ
日本人なら行間を読もうぜ。
0744nobodyさん2009/06/03(水) 16:21:20ID:???
>>738
メモ帳で作ってるカス発見。
0745nobodyさん2009/06/03(水) 16:30:31ID:???
>>743
お前ももう少し行間を読んだほうがいいw
>>734が争ってるのはそこじゃないw
0746nobodyさん2009/06/03(水) 16:36:05ID:isB4yDuL
空気読まずに質問
ごめんね

preg_replaceでとある文字列を抜き出して、抜き出した文字列をそのまま関数に投げたいんだけどうまくいかない
具体的に例えると
  $val = "_BBS_hoge_\.xxx.ne.jp";
でhogeの部分をaaaaaって関数に投げて、返ってきた結果をhogeのあった場所に代入したいんだけど、
  $val = preg_replace("/_BBS_(.+?)_/", aaaaa($1), $val);
ってな感じで書くと「変数名の一文字目に数字は使えないよ」って怒られてしまう
$1を${1}や{$1}、'$1'にしてみたけどやっぱりうまくいかなくてどうしていいものやら……誰かわかる人いたらお願いします
07477342009/06/03(水) 16:37:02ID:???
>>743
もう俺が自閉症って事で良いからつまんねー話題いつまでも引っ張るなヴォケ
あと今後は気軽に自閉症の疑いとか口走るんじゃねーよヴォケ
0748nobodyさん2009/06/03(水) 16:37:18ID:???
PDT
0749nobodyさん2009/06/03(水) 16:40:55ID:???
>>746
むしろ空気を呼んだといえるw
ちなみに答えは「$$1」か「\${1}」な。
0750nobodyさん2009/06/03(水) 16:57:33ID:isB4yDuL
>>749
ありがとう
でもそれでもうまくいかない……

$$1って書くとやっぱり
Parse error: syntax error, unexpected T_LNUMBER, expecting T_VARIABLE or '$'
で、
\${1}だと今度は
Warning: Unexpected character in input: '\' (ASCII=92) state=1
Warning: Cannot modify header information - headers already sent by 〜
って怒られる

関係あるかどうかわからないけど文字コードはUTF-8
0751nobodyさん2009/06/03(水) 17:01:08ID:???
$val = preg_replace("/_BBS_(.+?)_/", "aaaaa($1)", $val);
0752nobodyさん2009/06/03(水) 17:06:49ID:isB4yDuL
>>751
それもやってみたけどaaaaaが実行されずに
 $val = "_BBS_aaaaa(hoge)_\.xxx.ne.jp";
となってしまうんだ
0753nobodyさん2009/06/03(水) 17:08:41ID:???
preg_replace_callback

perlとは違うのだよperlとは
0754nobodyさん2009/06/03(水) 17:09:52ID:???
悪ぃ、元をよく読んでなかった
それだったら>>753
0755nobodyさん2009/06/03(水) 17:16:08ID:isB4yDuL
なるほど、それ専用の関数があったのか
とりあえずやってみるわ
みんなありがとう
0756nobodyさん2009/06/03(水) 17:21:16ID:???
>>749 イ`
0757nobodyさん2009/06/03(水) 17:30:30ID:???
while(true){
if( >>749が反省するまで) break;
echo "良く読んで回答しろ!";
}
0758nobodyさん2009/06/03(水) 18:47:27ID:???
breakでwhileを抜けるのって何か気持ち悪く感じるんだよな。
0759nobodyさん2009/06/03(水) 18:57:53ID:2UFTgxS5
ID変わったけど704です、>>706に教えていただいたようにLF付けてやったんですが
やはり空だったので別の方法を模索中です。
今回の質問の趣旨はrequireで得た内容はセッションに引継ぎは出来ないのでしょうか?
ソースは以下になります、requireするべきtext.txtの内容は1文字のみ数字です。
AA.php実行して、BB.phpにジャンプすると真っ白な画面で何も出ません。

<?php // AA.php
$message = '';
require('text.txt');
$message = $xxx;
session_start();
$_SESSION['s01']=$xxx;
echo $_SESSION['test01'];//ここでは表示される
echo "<br><a href=\"bb.php\" >BB.phpへ</a>";
?>

<?php //BB.php
session_start();
echo $_SESSION['s01'];//ここでは表示されない
session_unset();
?>
0760nobodyさん2009/06/03(水) 19:04:06ID:???
echo $_SESSION['test01'];//ここでは表示される
echo $_SESSION['s01'];//ここでは表示されない

なんでキーが違うのさ
0761nobodyさん2009/06/03(水) 19:07:08ID:2UFTgxS5
>>760
あ、すいません、タイプミスです。
実際はキーは同じものを使っています。
0762nobodyさん2009/06/03(水) 20:12:34ID:???
格納した同スクリプトでは表示されないはずだぞ
0763nobodyさん2009/06/03(水) 23:25:02ID:YYq96a9O
<?php // AA.php
$message = '';
require('text.txt');
$message = $xxx;
session_start();
$_SESSION['s01']=$xxx;
echo $_SESSION['test01'];//ここでは表示される
echo "<br><a href=\"bb.php\" >BB.phpへ</a>";
?>
requireってなんなの?
ここで出力されているからSESSION使えないんじゃない?
0764nobodyさん2009/06/03(水) 23:37:33ID:YYq96a9O
aa.php

<?php
session_start();
$message = '';
$fp = fopen("text.txt", 'r');
$message = fgets($fp);
$_SESSION['test01']=$message;
echo $_SESSION['test01'];//ここでは表示される
echo "<br><a href=\"bb.php\" >BB.phpへ</a>";
?>

bb.php

<?php //BB.php
session_start();
echo $_SESSION['test01'];//ここでは表示されない
session_unset();
?>

オレならこうするけど・・・
07657592009/06/04(木) 03:06:56ID:DxUnkjaQ
>>763
勉強になりました。
>>764
そのように書けば>>704も解決できました。fopenを使う手があったんですね。
レスくれた方、ありがとうございました。
0766nobodyさん2009/06/04(木) 08:09:44ID:f7spCjC/
>>765
がんばってね〜
0767nobodyさん2009/06/04(木) 11:51:01ID:???
質問です。

Windows上のPHP5で、以下のコマンドを、execコマンドで実行しても何も起こりません。
なぜでしょうか。

"C:\Program Files\X-Finder\XF.exe" "C:\Documents and Settings\myself\My Documents\Work\20090604"

XF.exeはX-Finderというファイラーで、引数の20090604というフォルダを開こうとしています。

前提として
・引数を消して、単純にXF.exeを起動するだけならできる。
・上のコマンドは、execに渡したものと同じ変数をechoして、コンソール上でコピペしたものなので、エスケープのミスとかではない。

execではコマンドライン引数は渡せないのでしょうか?
systemを使っても特に変わりません。
0768nobodyさん2009/06/04(木) 11:52:21ID:???
また、同じコマンドを、「ファイル名を指定して実行」すれば、期待通りの動作をしてくれます。
0769nobodyさん2009/06/04(木) 12:01:07ID:???
phpはどうやって実行してるの?
exec呼んだあとタスクマネージャのプロセスのとこには無いか?
もしhttpd経由で実行していて実行ユーザーが自分以外だったら
Httpdのサービスのプロパティのログオンのところで
「デスクトップとの対話をサービスに許可」にチェック入れたらどうなる?
↑これは確認のためにやるので、恒久的にはやらんほうがいいけど
0770nobodyさん2009/06/04(木) 12:37:16ID:???
>>767
cmd.exeをPHPインストールしたフォルダにコピーして置いとけ
0771nobodyさん2009/06/04(木) 15:20:05ID:???
>>769
httpd経由でなく、コンソール上からの起動です。

PHPスクリプトと同じディレクトリに.batファイルを置いて、

php WorkDir.php

としています。
もちろん、パスは通しているので、スクリプト自体はちゃんと起動しています。

>>770
cmd.exeとはMS-DOSのことですよね?
php.exeのディレクトリにコピーしましたが、動作変わりませんでした。
0772nobodyさん2009/06/04(木) 15:29:35ID:???
セーフモードとスペース入りの引数で""でくくる必要があるかを調べたり試してみて
0773nobodyさん2009/06/04(木) 17:17:32ID:F3Dggw/W
utf16のコードから文字の実体に変換するには
pack('H*', $code);

で変換できるのですが、
この方法だと、
JIS X 0213の一部の漢字が変更できません。

たとえば、
2A6B2 (「月」へんに「亀」という字です)
を変換しようとすると、うまくいきません

どうにかして変換する方法はないでしょうか?

よろしくお願いします。
0774nobodyさん2009/06/04(木) 18:00:27ID:U8QiT/yT
PHP勉強し始めて2日目です。

$this->arrJob = $masterData->getMasterData("mtb_job");

とかのソースの

->の意味がよくわかりません。
どなたかお教えいただけたら幸いです。
0775nobodyさん2009/06/04(木) 18:09:31ID:???
>>773
http://en.wikipedia.org/wiki/UTF-16/UCS-2#Example_UTF-16_encoding_procedure

>>774
http://www.google.co.jp/search?hl=ja&safe=off&q=php+"->"+意味
0776nobodyさん2009/06/04(木) 20:39:13ID:???
Oracleのクォート処理をしてくれる関数、もしくは静的メソッドないですか?
もちろん信頼できるので。
実際に接続するわけではないので、MDB2で捨て接続作るのもアホらしいし・・・。
0777nobodyさん2009/06/04(木) 20:54:19ID:???
取り急ぎこんなの作ってみたけどダメなんだろうか?w
文字列と数値にしか対応していないのはとりあえず置いておくとして、
インジェクションとか起こるかな?

function _ociQuote($str = '', $mode = 'text')
{
if ( ( $mode === (string) 'integer' or $mode === (string) 'int' ) && is_int($str) )
{
return $str;
} else {
$str = mysql_real_escape_string($str);
$str = "'".$str."'";
return $str;
}
}
0778nobodyさん2009/06/04(木) 20:55:13ID:???
インデントしてみる。
function _ociQuote($str = '', $mode = 'text')
{
    if ( ( $mode === (string) 'integer' or $mode === (string) 'int' ) && is_int($str) )
    {
        return $str;
    } else {
        $str = mysql_real_escape_string($str);
        $str = "'".$str."'";
        return $str;
    }
}
0779nobodyさん2009/06/04(木) 21:35:00ID:???
utf16よく知らんけど、775読んで書いてみた。

$code = '2A6B2';
$vd = hexdec($code) - 0x10000;
$w1 = ($vd >> 10) | 0xD800;
$w2 = ($vd & 0x3FF) | 0xDC00;
echo pack('n*', $w1, $w2);
0780nobodyさん2009/06/04(木) 21:36:05ID:ygVccNwT
質問なのですが
レイアウトの都合で
ポストされた文字を半角で入れた場合は20文字で、全角で入れた場合は10文字に制限したい。

もし全角と半角が混合されていた場合、それに合わせて文字数を制限したいんです。

全角が1文字入った場合は半角は18文字、というようにしたいのです。

今はループで一文字づつ調べて半角全角文字数を数えているのですが
もっと楽な方法ありませんか?
0781nobodyさん2009/06/04(木) 21:47:26ID:???
http://jp.php.net/manual/ja/function.mb-strwidth.php
http://jp.php.net/manual/ja/function.mb-strimwidth.php
こういうことかな?
0782nobodyさん2009/06/04(木) 21:47:30ID:???
>>780
mb_strlenでいいのでは?
0783nobodyさん2009/06/04(木) 22:07:17ID:EBVfDvxX
PHPのプログラムでwebサーバと通信させたいと思っています。
(製作するプログラムはクライアント側ということになります)

ある(やや大きめの)htmlファイルをダウンロードし、そのファイルの
中盤くらいに書いてあるデータを必要としているのですが、
通信相手のサーバに負担をかけないようにいくつかの条件を設定しました。

・gzipエンコーディングに対応
・htmlファイルのダウンロードとその解析を並列して行い、
 必要となるデータが書かれている部分をダウンロードし終わったら転送を打ち切る

後者だけならfsockopenで簡単にできるのですが、
前者にも対応するとなるとちょっと簡単なやり方が思いつきませんでした。

cURL拡張を利用して製作した実験用コードを次のレスに書き込みます。
07847832009/06/04(木) 22:15:48ID:EBVfDvxX
$mh = curl_multi_init();
$conn=curl_init('http://www.example.com/foo.html');

curl_setopt($conn,CURLOPT_RETURNTRANSFER,1);
curl_setopt($conn,CURLOPT_ENCODING, 'gzip');

curl_multi_add_handle($mh,$conn);

$active = null;
$mrc = curl_multi_exec($mh,$active);
//php.benscom.comのコピペ
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);

while ($active && $mrc == CURLM_OK) {
if (curl_multi_select($mh) != -1) {
do {
$mrc = curl_multi_exec($mh, $active);
$tmp = curl_multi_getcontent($conn[0]);
if (strlen($tmp)>=1)echo mb_substr(curl_multi_getcontent($conn[0]),-10)."<br>\r\n";
ob_flush();flush();
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
}
07857832009/06/04(木) 22:22:44ID:EBVfDvxX
ループ内のechoで今現在の通信内容の最後の10文字を切り出しています。
(全部出力したら画面が訳の分からないことになるので…)
このコードでとりあえず目的は達成することができました。


長くなりましたがここから質問とさせて頂きます。
もっとスマートなやり方は無いものでしょうか?
言い訳のつもりではないのですが私はなにぶん初心者でして
皆さんにとって常識であることが分かっていないのです
そんなめんどくさい事やらんでもこれで一発じゃん
というコードがもしあるのでしたらお教えいただけると幸いです
0786nobodyさん2009/06/04(木) 22:22:58ID:???
gzopenじゃだめなの?
07877832009/06/04(木) 22:25:15ID:EBVfDvxX
20行目と21行目を間違えていましたので訂正します 失礼しました

$tmp = curl_multi_getcontent($conn);
if (strlen($tmp)>=1)echo mb_substr(curl_multi_getcontent($conn),-10)."<br>\r\n";
07887832009/06/04(木) 22:48:51ID:EBVfDvxX
>>786
gzopenって通信にも使えるんでしょうか?
まずそこが分かっていません
第一引数がファイル名だし、できなそうに見えるんですがどうなんでしょうか
0789nobodyさん2009/06/04(木) 22:56:40ID:???
鯖管として言わせて貰うと、HTMLを全部落とそうが途中まで落とそうが、たいした差はつかんからどうでもいい。
むしろダラダラセッションを張りっぱなしにされると面倒だ。解析とか後にしてとっとと切ってくれ。

サーバのためを思うなら
・適当にsleep()して間隔をあけてダウンロードする。curl_multi()で大量にコネクション張って並列DLとか最悪
・複数落とすならKeep-Aliveでセッションを張る。技術的詳細はぐぐれ。これだけでサーバへの負荷はかなり落ちる
0790nobodyさん2009/06/04(木) 23:23:57ID:???
>>788
できます
0791nobodyさん2009/06/04(木) 23:46:25ID:f7spCjC/
>>780

オレなら

<html>
<form method="post" action="">
<textarea name="body"></textarea>
<input type="submit">
</form>
</html>
<?php
$value = trim( $_POST['body'] );
echo '[' . $value . ']';

$mb_length = mb_strlen($value);

$length = strlen($value);

echo "全角";
echo ($length - $mb_length) / 2;

echo "半角";
echo $mb_length - ($length - $mb_length) / 2;

0792nobodyさん2009/06/05(金) 00:05:13ID:???
>>791
そのコード、UTF-8だと恐らくコケルよ。
0793nobodyさん2009/06/05(金) 00:10:20ID:NOP8aSiI
>>792
適当に書いたけど、どの変がまずかった?w

UTFで試して特に問題なかったんだけど
0794nobodyさん2009/06/05(金) 00:20:51ID:???
[aaああ]全角0半角6
0795nobodyさん2009/06/05(金) 00:22:38ID:???
>>793
UTF-8は、全角が3バイトとかだよ。
0796nobodyさん2009/06/05(金) 00:26:47ID:???
>793
こんなもんは常識だと思うのだが。UTF-8には2バイトより大きい文字が多数存在する。
漢字の大半は3バイトだし、特殊な一部文字は4バイト。
0797nobodyさん2009/06/05(金) 00:31:57ID:???
UTF8は全角が3バイトなんじゃなくて文字が1バイト〜5バイトのどれか
07987832009/06/05(金) 00:37:17ID:fALDRgQl
>>789
>むしろダラダラセッションを張りっぱなしにされると面倒だ。解析とか後にしてとっとと切ってくれ。
これはもう完全に実装後のチューニングの後考えるべき問題で
手法自体を否定する根拠にはならないと思います

>複数落とすならKeep-Aliveでセッションを張る。
今回は一つしかファイルを必要としないのでkeep-aliveは必要としないのですが
それはそれとして個人的な意見を言うとIE8もFF3もRFCなんか無視して
サーバ当たりの接続数を増やしている昨今 一度に3桁のファイルを落とす
なんて事がない限りもうkeep-aliveやHTTPパイプライニングにこだわる必要は無いと思います

>>790
ヒントください
0799nobodyさん2009/06/05(金) 00:49:56ID:???
>>798
マニュアル
0800nobodyさん2009/06/05(金) 00:59:34ID:NOP8aSiI
EUC-JPにしたらええの?
0801nobodyさん2009/06/05(金) 01:50:06ID:???
>>798
http://jp2.php.net/manual/ja/function.gzopen.php

user note になんか書いてあるけど、これとは違うかな
08027832009/06/05(金) 02:22:20ID:fALDRgQl
>>801
ありがとうございます
勉強になりました

ただこの手法、今一つやりたい事と噛み合わない気がするので
ちょっと調べてみます
0803nobodyさん2009/06/05(金) 06:11:10ID:iw3Rl46Q
たとえば200行くらいから成るdatファイルをfopenで開いて、
fgetsする際に、150から200行だけの情報をゲットしたいときに
forで200回くりかえしif で$i >150 のときだけゲットするようにしたのですが、
この何もしない150回分を省きたいのです。
例えば、fopen( $dat , "r" , 150 , 200 )というように
指定できたら、と思います。
そういった方法はありますでしょうか、またそれに取って代わる関数など
方法があればよろしくお願いします。
0804nobodyさん2009/06/05(金) 06:57:52ID:???
SPLが使える環境ならSplFileObject->seek($line_pos)
0805nobodyさん2009/06/05(金) 07:05:34ID:iw3Rl46Q
>>804
なるほど、少しぐぐってみました
こんな便利なものがあったとは
ありがとうございました。
0806nobodyさん2009/06/05(金) 08:00:41ID:???
curlにせよスレッドにせよ、「複数コンテンツを並列に取得」する場合だけ「クライアントの処理」が早くなる。対向サーバそれぞれの負荷とは関係が無い
クライアント側でも単一ソースを取得するだけなら意味が無いというか、空回りしてるwhileが無駄

zlibは圧縮ストリームの終了フラグを見ているはずなので、そのコードではコンテンツが全て取得されてから処理されているか圧縮転送されていないだろう
パケットを拾ったりベンチマークして確認してみたほうがいいと思う

基本的にストリーム圧縮はチャンクごとに展開できないので平行解析は両立しない。適切なほうを選ぶのがいいのでは

関係ないが接続数が多い「から」Keepaliveが重要になる
こだわれよ
0807nobodyさん2009/06/05(金) 10:42:13ID:???
cURLは各コネクションに割り込めるわけじゃないからね。
帯域をケチりたいなら2ch伝統のRange + Deflateでしょw
08088032009/06/05(金) 12:24:44ID:iw3Rl46Q
<?php

$inputs = new NoRewindIterator(new SplFileObject("http://pc11.2ch.net/php/dat/1240835951.dat" , "r"));

$min = 150;

$inputs->seek( $min );

foreach($inputs as $line)
{

echo $line;

}


?>

とやってみたのですが、apache.exe終了ダイアログがでてきて
終了してしまいます。(seek以降のforeach文の部分がなくてもエラーがでます)
イメージ的には、$minまでシークさせておいて、
そこからforeachで、
という感じでできるのかなと思ったのですが・・
アドバイスよろしくおねがいいたします。

php 5.2.6 apache2.0.63
0809nobodyさん2009/06/05(金) 12:35:03ID:???
そのseekって行指定できるの?
というか固定長でも無い限り普通に150回分の空回しするほうが早いと思うんだけど。
0810nobodyさん2009/06/05(金) 12:43:56ID:iw3Rl46Q
>>809
一応最高で500回くらいの空回しを考えているのですが、
そのまま空回ししておくほうがよいですかね、
今のところは空回しでやる方向でいこうと思います。
ありがとうございました。
08117832009/06/05(金) 13:48:15ID:fALDRgQl
検証用コードその1サーバー側

header("Content-Type: text/html");
header("Content-Encoding: gzip");

$fp=fopen('target.gz','r');
if($fp!==false){
while(!feof($fp)){
$tmp = fread($fp,1024);
echo $tmp;
ob_flush();flush();
sleep(1);
}
fclose($fp);
}

サーバー側においてある15kバイトのgzipファイルを1024バイトずつ読み込み、
一秒おきに標準出力に吐き出します
08127832009/06/05(金) 13:52:02ID:fALDRgQl
検証用コードその2 クライアント側
>>784を若干書き換えて、ループ内で現在利用できる
デコード後の文字の数を返すようにしています

$mh = curl_multi_init();
$conn=curl_init('http://www.example.com/foo.html');

curl_setopt($conn,CURLOPT_RETURNTRANSFER,1);
curl_setopt($conn,CURLOPT_ENCODING, 'gzip');

curl_multi_add_handle($mh,$conn);

$active = null;
$mrc = curl_multi_exec($mh,$active);
//php.benscom.comのコピペ
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);

while ($active && $mrc == CURLM_OK) {
if (curl_multi_select($mh) != -1) {
do {
$mrc = curl_multi_exec($mh, $active);
$tmp = curl_multi_getcontent($conn);
if (strlen($tmp)>=1) echo "今の文字数は".strlen($tmp)."だよ<br>";
ob_flush();flush();
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
}
08137832009/06/05(金) 14:12:21ID:fALDRgQl
結果:
今の文字数は8150だよ
今の文字数は12001だよ
今の文字数は16370だよ
今の文字数は20521だよ
今の文字数は25237だよ
今の文字数は29685だよ
今の文字数は34473だよ
今の文字数は39667だよ
今の文字数は44072だよ
今の文字数は47822だよ
今の文字数は51734だよ
今の文字数は53975だよ
今の文字数は53975だよ
今の文字数は53975だよ

となり、きっちり段階的に取得できています。
(最後の文字数が同じものがいくつか並ぶのは
 $mrcがCURLM_CALL_MULTI_PERFORMでなくなるタイミングが遅れるからのようです
 本来ならfeofでループ判定するべきなのでしょう)

>>806
というわけでできます
サーバー側が平文の出力を全部バッファしてから圧縮するような実装だと
無意味ですけどね
08147832009/06/05(金) 14:13:44ID:fALDRgQl
>>807
curl multiだと終了前にcurl_multi_getcontentで部分取得できます

2ちゃんに関していうとrangeで部分取得すると
圧縮せずに送ってくるのであんまり意味無いんですよね
これが一般的なサーバの実装なのかは分かりかねるんですが

range+無圧縮が全体+圧縮より効率的に働くのは
rangeの範囲を相当限定できるようなケースだけだと思います

余談ですがそもそも2ちゃんのdatファイルは最大保持期間5秒とされているので
(あぼーん対策?)
一般的な2ちゃんブラウザで行われてるrangeで新着分を継ぎ足していく
手法は不適切だと思うんですよねー
0815nobodyさん2009/06/05(金) 15:28:12ID:???
PHPスクリプト内でSQL文を書くとき、可読性を上げるための工夫ってしていますか?

私はこんな感じです。
$sql = "SELECT             ".
       "    article_id,    ".
       "    subject,       ".
       "    name,          ".
       "    mail,          ".
       "    url,           ".
       "    comment        ".
       "FROM               ".
       "    articles       ".
       "WHERE              ".
       "    article_id = 1 ".
       "AND                ".
       "    del_flg    < 0 ";

(等角フォントのエディタにはればうまくいくはず)
0816nobodyさん2009/06/05(金) 15:29:25ID:???
やり過ぎだろJK
0817nobodyさん2009/06/05(金) 15:47:27ID:???
そういう書き方するならヒアドキュメント使うかな
0818nobodyさん2009/06/05(金) 15:51:40ID:???
俺は

$sql = "SELECT a, b, c, d, e
FROM hoge
LEFT JOIN hage USING (h_id)
WHERE foo = :foo
AND bar = :bar"

みたいな感じでやってるよ
もしくはオブジェクトのメソッドチェーンとかでもいいんでない?
0819nobodyさん2009/06/05(金) 15:52:36ID:???
ってスペース全部消えた

$sql = "SELECT a, b, c, d, e
       FROM hoge
         LEFT JOIN hage USING (h_id)
     WHERE foo = :foo
       AND bar = :bar";
0820nobodyさん2009/06/05(金) 16:56:40ID:qGPfEtmY
チンポ
0821nobodyさん2009/06/05(金) 18:27:00ID:???
>>813
いや、目的に対して何の検証になってないんだが・・・
バイト数からすると転送コーディングのchunked dataサイズだな
まあ予想通りだ
0822nobodyさん2009/06/05(金) 18:34:04ID:???
>>819
俺もそんな感じだけどログが見づらくならない?
0823nobodyさん2009/06/05(金) 18:35:04ID:???
PEARのMDB2+PostgreSql8.3.7で開発してるんですが、
テーブルのID(Serial型)へのInsertがうまくいきません。
autoExecuteメソッドに、
$values = array(
//'id'(Serial型なので書かない)
'clm1' => 'text1',
'clm2' => 'text2'
);
こんな感じでデータをセットしていますが、何故かclm1の値が0で
挿入されてしまいidフィールドのシーケンスもインクリメントされません。
何か対処方法があるのでしょうか?

0824nobodyさん2009/06/05(金) 18:47:47ID:???
俺は . を行頭にしてる。arrayはアイテム末尾だけど

$sql = "SELECT "
. "* ...
0825nobodyさん2009/06/05(金) 18:49:18ID:???
>>814
783さんの例のように作りおきのgzipに対してはrangeヘッダーが使えるはずですよ
■ このスレッドは過去ログ倉庫に格納されています