トップページ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等)・フレームワークは各該当スレへ
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ヘッダーが使えるはずですよ
0826nobodyさん2009/06/05(金) 18:54:39ID:???
>>823
そんなのわかんね
0827nobodyさん2009/06/05(金) 19:02:43ID:???
>>821
cURLがチャンクサイズみて内部バッファを決めてるとは思えないなあ。
4k決めうちと思うけど。
08287832009/06/05(金) 19:37:51ID:fALDRgQl
>>821
>>811のサーバ側プログラムは15kBのgzipファイルを1kずつ吐いているので
当然終了には15秒かかります。
これを>>812で読み込むとgzipファイルを全部DLしてから解凍しているのであれば
最初の「今の文字数は8150だよ」が表示されるまで15秒以上かかるはずです。
しかし実際には>>812を表示してすぐに「今の文字数は8150だよ」と表示されます。
これはcURLがDLした部分のgzipを段階的に解凍している証拠です。

あとは実際に$tmpの中身が解凍された文字列なのか?という問題ですが
これはechoで簡単に確認できます。

検証できてないというのなら反証するコード出してください。
それがプログラマーっつうもんじゃねえのかクソが
0829nobodyさん2009/06/05(金) 20:17:21ID:???
結局 ID:fALDRgQl は何が聞きたいんだ?
変な検証とかは自分のblogとかでやって欲しいんだが
08307832009/06/05(金) 20:43:27ID:fALDRgQl
>>829
聞きたいのは>>785の、
gzipでエンコードされたファイルをダウンロードしながら並行して解析するための
スマートなコードです
(自分のコードでも目的自体は達成しているのですが糞コードなので)

gzipでエンコードされたファイルをダウンロードしながら並行して解析すること自体が
不可能という意見を頂いたので、それを否定するための検証がダラダラと長くなりました
ご迷惑をおかけしました
0831nobodyさん2009/06/05(金) 20:51:40ID:???
>>827
すまん。考えてみれば当然か
いずれにせよgzip/deflateのブロックじゃないな
0832nobodyさん2009/06/05(金) 20:55:28ID:???
よそでやらせないのがこのスレの意義だろ
全方位天然くん歓迎だよ
0833nobodyさん2009/06/05(金) 22:16:31ID:???
gzipは最後まで読み込まないと解答できないよ
0834nobodyさん2009/06/05(金) 22:26:10ID:???
>>827,831
CURLOPT_BUFFERSIZEがあるよ
http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTBUFFERSIZE
PHPレベルでのキャッシュもあるようだし、fdset()がどのタイミングでリターンするかは知らね
0835nobodyさん2009/06/05(金) 22:44:06ID:???
>>822
ログってどこに表示される何のログじゃろ?
0836nobodyさん2009/06/05(金) 22:56:04ID:???
某StringIOみたいなオブジェクトってない?
0837nobodyさん2009/06/05(金) 23:24:35ID:u1D4YO7O
mixiに以前登録した時のメアドがわからずログインが出来なくなりました…

解約して新規で携帯を買うしかないですか??
0838nobodyさん2009/06/05(金) 23:40:42ID:???
>>837
新しく作ればいいよ 大変だけど
SNSとかならオープンソースあるっしょ
0839nobodyさん2009/06/05(金) 23:41:13ID:???
>>836
http://jp.php.net/manual/ja/wrappers.php.php
のphp://memoryをSplFileObjectで使う、とか?
0840nobodyさん2009/06/06(土) 00:06:01ID:???
>>839
サンキュー検討するわ
つーかお前の発想の柔軟さに驚いた
0841nobodyさん2009/06/06(土) 00:10:14ID:???
なにこの偉そうな口調・・・
08428402009/06/06(土) 00:10:59ID:???
すまんまじすまん
08437832009/06/06(土) 01:07:42ID:nrE5UTqJ
検証関係はウザいでしょうからこれで最後にします(レスは歓迎します)
>811のサーバ用で使っているgzipファイルを
ある程度長くて著作権フリーなもの、ということで太宰治の人間失格を
圧縮した物を用います(本当は日本国憲法あたりにしたかったけど短すぎた)
サイズは非圧縮時で151,900バイト、圧縮時で67,671バイトとなっています
この圧縮ファイルを1秒に8192バイトずつ送信します。(9秒後に終わる計算になります)

クライアント側のコードは下記の通り書き換えて、
経過時間、解凍された文字列の文字数、解凍された文字列の最後の文字列
を表示するようにしています
0844nobodyさん2009/06/06(土) 01:11:06ID:???
>>834
PHPつうかハンドラのバッファ
ソケット叩いて回るようなレベルじゃパフォーマンスでねーから
08457832009/06/06(土) 01:13:14ID:nrE5UTqJ
$time = time();//コードの実行開始時間
$mh = curl_multi_init();
$conn=curl_init('http://www.example.com/foo.php');
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);
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 '現在の経過時間は'.(time() - $time).'秒です<br>';
echo '解凍された文字数は'.strlen($tmp).'文字です<br>';
echo '解凍された文字列の最後「'.mb_substr($tmp,-64).'」<br>';
ob_flush();flush();
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
}
08467832009/06/06(土) 01:17:54ID:nrE5UTqJ
結果
現在の経過時間は0秒です
解凍された文字数は4738文字です
解凍された文字列の最後「たぎ越えるための頗る実利的な階段に過ぎないのを発見して、にわかに」
現在の経過時間は0秒です
解凍された文字数は16750文字です
解凍された文字列の最後「ました。ほとんど完全に近く人をだまして、そうして、或るひとりの全」
現在の経過時間は1秒です
解凍された文字数は16750文字です
解凍された文字列の最後「ました。ほとんど完全に近く人をだまして、そうして、或るひとりの全」
現在の経過時間は1秒です
解凍された文字数は35377文字です
解凍された文字列の最後「ナした。自分なども、ゴッホの原色版をかなりたくさん見て、タッチの磨v
現在の経過時間は2秒です
解凍された文字数は35377文字です
解凍された文字列の最後「ナした。自分なども、ゴッホの原色版をかなりたくさん見て、タッチの磨v
現在の経過時間は2秒です
解凍された文字数は53886文字です
解凍された文字列の最後「、邸宅と召使いを提供して置くのも、むだな事だとでも考えたのか、(」
現在の経過時間は3秒です
解凍された文字数は53886文字です
解凍された文字列の最後「、邸宅と召使いを提供して置くのも、むだな事だとでも考えたのか、(」
現在の経過時間は3秒です
解凍された文字数は72654文字です
解凍された文字列の最後「好都合な事になり、やがて自分が自殺幇助(ほうじょ)罪という罪名で」
現在の経過時間は4秒です
解凍された文字数は91351文字です
解凍された文字列の最後「オなけれゃいけないんですから。いいえ、でも、せっかくの御自慢のおav
(略)
08477832009/06/06(土) 01:21:00ID:nrE5UTqJ
>>833
というわけで、gzipの最後がサーバから送られてくるのは
>>843の通り9秒後なのですが
9秒後以前に途中まで解凍できています
0848nobodyさん2009/06/06(土) 02:03:19ID:???
>>839
ありがとう
ほとんどコンストラクタだけのクラスでごまかせそうだ
0849836,8482009/06/06(土) 02:07:31ID:JWHRbWFk
なんか騙られたと思ったらID必須ってことを言いたかったのか?
いやはや申し訳ない
また何かあればよろしくお願いしますー
0850nobodyさん2009/06/06(土) 02:12:45ID:???
某rubyとか隠す必要あんの?
0851nobodyさん2009/06/06(土) 02:46:03ID:???
>>850
Rubyの専売じゃないと思うけどな。
PHPでは文字列型は可変だし、IOというinterfaceがあるわけじゃないから
個人的にはあまり必要ないと思ってしまう。。
みんな意外にOOPしてるのだろうか。
0852nobodyさん2009/06/06(土) 03:13:16ID:???
>>851
ごくたまにファイルと文字列を透過的に
扱いたいことはある
0853nobodyさん2009/06/06(土) 03:52:57ID:???
>>845
一切変わってなくてワロタ
分かっててやってるなw
■ このスレッドは過去ログ倉庫に格納されています