【PHP】下らねぇ質問はID出して書き込みやがれ 114
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2012/01/02(月) 02:03:25.50ID:???過去スレ、関連スレ、FAQなどは>>2-10辺り
次スレは>>980が立てる。10分以内に立たない場合、宣言してから立てたい人が立てること。
◆前スレ
【PHP】下らねぇ質問はID出して書き込みやがれ 113
http://kohada.2ch.net/test/read.cgi/php/1322564127/
◆質問用テンプレ
【OS名】CentOS
【PHPのバージョン】5.3
【連携ソフトウェア】MySQL ImageMagick
【質問内容】
◆質問する時の注意
・ スレを上げて自分のIDを表示させること。(メール欄に何も記述しない。専ブラのsageチェックを外す)
・ 己の行った操作、変更などを詳しく明記すること。
・ エラーメッセージはそのまま表記すること。「エラーが出ます」だけでは回答不可。
・ 質問者として、態度をわきまえること。
・ 事前に関連リンクの公式マニュアル、リファレンス本くらいはちゃんと目を通しておくこと。
(PHPで最良の教本はこの公式マニュアル。市販の書籍は嘘が多いので鵜呑みにしない。)
◆質問後の注意
・2回目以降は最初に質問した際のレス番号を入れて、偽者防止に必ずIDを表示させること。
・解決しなくても回答をもらった場合はお礼を言うこと。
(荒らし、煽りは除く。煽られたときも、無闇に反論せずスルーすること。)
◆回答者への注意
・誰にレスしているのか分からないと困るので、>>(アンカー)をつけて回答すること。
【その他諸注意】
・SQL・正規表現・PEAR・テンプレート(Smarty等)・フレームワークは各該当スレへ
0588nobodyさん
2012/01/10(火) 20:01:42.81ID:???$date = 書き込んだ日;
$date = mktime($date);
$now = time();
$date = $now - $date > 60*60*24*10 ? 10 : $date;
0589nobodyさん
2012/01/10(火) 20:02:28.76ID:???0590nobodyさん
2012/01/10(火) 20:03:08.26ID:???$dateってただの変数じゃん
これでどうかな
<?php
$posted_str = "2011/12/26"; //投稿日
$posted = strtotime($posted_str);
$now = time();
$date_format = "Y/m/d";
$posted_disp = $posted<($now-(60*60*24*15)) ? ($now-(60*60*24*10)) : $posted;
print "今日:".date($date_format)."<br />
元投稿日:".date($date_format,$posted)."<br />
表示投稿日:".date($date_format,$posted_disp);
0591nobodyさん
2012/01/10(火) 20:03:29.35ID:???0593nobodyさん
2012/01/10(火) 20:28:04.95ID:???$post_date // これを投稿日時だとする(UNIXTIME)
$limit = 60 * 60 * 24 * 14; // 期限14日前とする
if($_SERVER['REQUEST_TIME'] - $post_date > $limit) {
$post_date -= 60 * 60 * 24 * 10;
}
echo date('Y-m-d', $post_date);
0594587
2012/01/10(火) 21:08:57.11ID:???すごい助かります!
60 * 60 * 24 * 10 の10は10日前という数字だとわかりますが、
他の数字60,60,24 の意味を教えていただけると勉強になります。
よろしくお願いしますm(_ _)m
0595nobodyさん
2012/01/10(火) 21:16:12.68ID:???1秒をかけてる
0596nobodyさん
2012/01/10(火) 21:17:14.75ID:???$_SERVERは使うな!!!!!!!!!!!!!!!
getenvを使えっ!!!!!!!!!!!!!!!!!!!!
0597nobodyさん
2012/01/10(火) 21:17:39.58ID:???0599nobodyさん
2012/01/10(火) 21:34:28.20ID:HU7fZVh4カラム名がaaa、bbb、cccとして、
その内の一つ、または複数の値を変更するような場合にはどのように記述すればいいのでしょうか?
マニュアルなどを見ると、VALUESのようにデータベースに与える値をプレースホルダに割り当てるのは分かるのですが、
自分は値だけでなく、カラム名にも変数を割り当てたいのです
prepare('UPDATE table SET $name = :name WHERE $url = :url')のような型です
まさかprepare('UPDATE table SET :name1 = :name2 WHERE :url1 = :url2')のような型にはできないでしょうし
この場合、どのように記述すればいいのでしょうか?
0602nobodyさん
2012/01/10(火) 21:39:00.09ID:???普通に
UPDATE table SET col1=? WHERE col2=?
でいいんじゃねーの
カラム名に変数割り当てるなら上を
"UPDATE table SET {$col1}=? WHERE {$col2}=?"
すりゃいいじゃん
0603587
2012/01/10(火) 22:25:58.95ID:???とても助かります!
とりあえず593の$post_dateを$dateに変えて記述してみたのですが、
$limit = 60 * 60 * 24 * 14; // 期限14日前とする
の行でエラーが出てしまいます。
最終的に表示させたい場所に
echo date('Y-m-d', $post_date);
を書けばいいという認識であっていますか??
初歩的すぎて、すいませんが、よろしくお願いします。
0604nobodyさん
2012/01/10(火) 22:33:03.94ID:???その行でいきなりエラーはないだろw
投稿日時はどうやって受け取って、どういう形式で保存してんの?
例)2012/01/10、とか、2012-01-10、とか、1326121200、とか。
0605nobodyさん
2012/01/10(火) 22:33:49.35ID:???>の行でエラーが出てしまいます。
んなアホな
違うところだろ
>最終的に表示させたい場所に
>echo date('Y-m-d', $post_date);
しらんがな
どんなソースになってるのかもわからんし
0608nobodyさん
2012/01/10(火) 22:49:22.50ID:???0609nobodyさん
2012/01/10(火) 22:49:50.87ID:DbdGI1rD【PHPのバージョン】5.2.17
【連携ソフトウェア】MySQL GD
【質問内容】
GDの機能を使って画像を作成して、データベースに入れていくのですが、
imagepng()とかで画像をファイルに保存したり、ブラウザに出したりしますよね?
これの出力結果を直接文字列として変数に格納したいのですが、どうすればよいでしょうか?
$data = imagepng()とかも試してみましたが、trueしか返ってきませんでした。
0610587
2012/01/10(火) 22:52:45.04ID:???すいません、違うところのエラーですか。(^^;
メールで投稿する形式の掲示板で、メールサーバーに
投稿記事を取りに行くphpには、以下のように記載されています。
※日付は1323413498等という形で保存されています。
// 日付の袖しつ
eregi("Date:[ \t]*([^\r\n]+)", $head, $datereg);
$now = strtotime($datereg[1]);
if ($now == -1) $now = time();
呼び出すphpの冒頭にはには
$date = date("y/m/d", $ptime);
とだけ書かれています。
最終的には、$dateと書いたところに日時が表示されています。
0611nobodyさん
2012/01/10(火) 22:54:19.13ID:DbdGI1rDob_start();
imagepng($resource);
$data = ob_get_contents();
ob_end_clean();
0612nobodyさん
2012/01/10(火) 22:56:28.46ID:???ヒント:base64_encode
>>610
もうここで聞く以前の学習を
>$date = date("y/m/d", $ptime);
$ptimeには何が入ってるの?すでにUNIXTIMEが入ってるなら
$date = $ptime;
でいいよ、代入する意味ないけど
0614nobodyさん
2012/01/11(水) 00:23:58.10ID:???0615nobodyさん
2012/01/11(水) 00:26:28.08ID:dfPHpXiU0616nobodyさん
2012/01/11(水) 00:29:05.90ID:???http://kohada.2ch.net/test/read.cgi/php/1131016915/
0617nobodyさん
2012/01/11(水) 00:35:11.26ID:dfPHpXiU0618nobodyさん
2012/01/11(水) 00:37:35.15ID:dfPHpXiUPHPの分散オブジェクト技術にはどのようなものがありますか?
0619nobodyさん
2012/01/11(水) 00:41:39.74ID:???0620nobodyさん
2012/01/11(水) 12:55:49.06ID:eyRErrPBphp.iniで session.cookie_domain = ".example.com" を指定してもうまくいきません。
また、.phpの中で直接設定しようと以下のようにテストしたんですがやはりうまくいきません
(aaaとbbbを変更するとセッション値がカラになる)
//session_set.php
ini_set("session.cookie_domain", ".example.com");
session_start();
$_SESSION['animal'] = "cat";
echo "animal>>>";
echo $_SESSION['animal'];
//session_check.php この.phpをaaa.example.comとbbb.example.comで確認する
ini_set("session.cookie_domain", ".example.com");
session_start();
echo "animal>>>";
echo $_SESSION['animal'];
何が原因でしょうか?
php.iniで他に何か設定しなきゃいけないのでしょうか。
ご意見よろしくお願いします
0622nobodyさん
2012/01/11(水) 13:15:03.58ID:???マニュアルを読まないのが原因です
0623nobodyさん
2012/01/11(水) 13:27:59.44ID:eyRErrPBありがとうございます
http://php.net/manual/ja/function.session-set-cookie-params.php
を見てるんですが、
「すべてのサブドメインでクッキーを有効にしたい場合は、先頭にドットをつけて '.php.net' のようにします。」
とあるようにサブドメインの変更までなら対応できるのではないですか?
0624nobodyさん
2012/01/11(水) 13:30:15.06ID:???0625nobodyさん
2012/01/11(水) 13:36:51.45ID:???そのブログの設定ファイルがphp.iniより優先するということでしょうか
実はちょうど今session_set_cookie_params();で対応できたんですが
そちらの勉強もしてみます
ありがとうございました
0627nobodyさん
2012/01/11(水) 14:07:42.61ID:VbJoExbW皆さんはPHPにて「並行処理」をしたい場合、どのようにされていますでしょうか?
自分がやりたいのは、あるスクリプトがあり、それを引数(設定値)だけを変えて
決められた時間の間隔にて(sleep()等を使って)繰り返し、大量に(少なくとも20位)かつ”同時に”実行したいと思っております
子プロセスの同期は必要ないと思います
ファイルをコピーして、各スクリプト毎に設定値を書いて・・・って言うのは現実的ではないので
データベースなどからリストを取得して、その設定値を使ってそれぞれを同時に実行したいと思っております
(fwrite()などで、設定毎にスクリプトを作成していこうかとも考えましたが・・・)
しかし色々考えたのですが、全然いいアイデアが浮かんできません
このような場合、どのようにすればいいのでしょうか?
0628nobodyさん
2012/01/11(水) 14:08:07.06ID:VbJoExbW$list = array(~DBからの設定値~);
$pid = pcntl_fork();
if ($pid == -1) {
die('ダメ');
} else if ($pid) {
pcntl_wait($status);
} else { //子プロセス
foreach(~$list~)とかイテレータ{
system()とか
}
}
上記のようにforeach()で回してしまうと、設定値を読み込んだ順に実行されていくので
普通のイテレータ使ったスクリプトと同じで、並列処理にはならないように思います
それともforeach()をif()の外で回して配列に格納しておいて、$iという数字をインクリメント
した後に子プロセス内にてfor()にて一気にsystem($list[$i])等で実行すればいいのでしょうか?
>>627のような実装をしたい場合に何かアドバイスを頂けないでしょうか?
0629nobodyさん
2012/01/11(水) 14:20:29.14ID:???0630nobodyさん
2012/01/11(水) 15:00:30.88ID:???foreach ( $list ... ) {
if ( ($pid = pcntl_fork()) === 0 ) {
子でやりたいこと
exit(0);//終わる
} else if ($pid == -1) die("x");
}
//親での処理(終わるの待つとか)
0632nobodyさん
2012/01/11(水) 15:25:25.54ID:VbJoExbW自分のやりたい事とは少し違いますが、説明が簡単な例としては、Googleのクローラなんかがあると思います
データをどういう手法か分かりませんが、初期のものでも1サーバに300ものクローラを使っていたとの事です
クローラは動き回っているので考え方が違うかもしれませんが、例えば自社や関連会社のデータなど固定されたターゲットの場合はcronなどで定期的に訪問出来るでしょうが、
それらの設定値をいちいちファイルに記述するのも大変なので、それぞれの場所にてデータを取得するためのxPathなど設定値リストを読み込んで、
スクリプトにて一気に並行処理にて自動的に行う、という事をやりたいと考えております
ただ、アクセスし続けるのも相手側に付加がかかるので、各スクリプトの訪問間隔を大きい相手は5分、小さい相手は1時間などにしたいと考えております
また、それらのデータを正常に取得したら、その瞬間に今度はそのデータを解析・整形するようなスクリプトを起動させたいと考えております
以上の点にて宜しくお願いいたします
0633nobodyさん
2012/01/11(水) 16:03:46.74ID:???取得先が大量にあって直列処理だと時間がかかりすぎるしそれぞれ取得設定を書くのもめんどいから
並列にしたいってことでおk?
ならcURLのマルチ使って、設定値をdbなどから引っ張ってきてから
回しながらcallbackなんかをうまく設定して一気にゴー、で行けるんじゃないか。
やりたいことと違っていたならすまん。
参照:ttp://techblog.ecstudio.jp/tech-tips/php-multi.html
0635nobodyさん
2012/01/11(水) 16:46:00.24ID:???PHPは標準で並列処理できない仕様だ。
並列処理できる言語、並列処理できるソフトを使って保存してから
PHPでそこにアクセスしたら良い。
0636nobodyさん
2012/01/11(水) 16:58:01.39ID:???通信だけは並列にできるいうことだが。クローラーはパフォーマンスを落とさずに、並列処理可能な言語・ツールに並べる可能性はある。
0637nobodyさん
2012/01/11(水) 17:09:13.29ID:???0638nobodyさん
2012/01/11(水) 17:40:57.15ID:???0639nobodyさん
2012/01/11(水) 17:43:06.65ID:???のコンパイルは結局うまくいったのか?
0641nobodyさん
2012/01/11(水) 18:17:50.79ID:???0642nobodyさん
2012/01/11(水) 19:03:57.60ID:???0643nobodyさん
2012/01/11(水) 19:05:55.41ID:???0645nobodyさん
2012/01/11(水) 19:31:49.93ID:???0646nobodyさん
2012/01/11(水) 20:04:08.13ID:???for ($i = 0; >>643の心が折れるまで; $i++) {
$result[] = kokuhaku($list[$i]);
}
if ($result == NULL){
die("まだ2次元がある");
}
0647nobodyさん
2012/01/11(水) 20:48:30.27ID:tHZDD+V0hoge.txtというテキストファイルがありまして
100バイトの文字列\n
100バイトの文字列\n
100バイトの文字列\n
:
:
:
と500行ある500KBののテキストファイルがあるとします
このファイルから
「499行目と500行目」
か
「1行目と2行目」
だけを取り出すとき、サーバーの負荷は
両方1〜500行の文字を取り出すときとほぼ同じ負荷でしょうか?
0648nobodyさん
2012/01/11(水) 20:50:49.28ID:???501 :nobodyさん:2012/01/08(日) 19:46:27.97 ID:???
>>489
abstractとinterfaceの具体的な使い分けはどうしてますか?
実装が書きたかったらabstractっていうのはあまりにもアレなので
哲学とまでは言いませんが、確固たる理由をつけて使い分けたいんです
0649nobodyさん
2012/01/11(水) 20:52:56.46ID:???読み込む位置が確定していたら、シークするだけの違いしかなく負荷に大差ないが。
改行位置の判定からやっていたら後ろの方が手間掛かる。
0650nobodyさん
2012/01/11(水) 21:08:42.58ID:???真実は一つだけ
怒りは自然な感情
戦争・テロは無くならない
死刑には殺人の抑止力がある
虐められる側にも虐めの原因がある
自己チューな人間ほど自己愛が強い
などの間違いを解説中
感情自己責任論
0651nobodyさん
2012/01/11(水) 21:13:42.02ID:tHZDD+V0という事はどんなやり方でも最低でも500KBかかってしまうという事でしょうか?
200バイト(2行分)程度だけで住む方法ないかなーと思ってたのですが
0652nobodyさん
2012/01/11(水) 21:34:41.86ID:???0653nobodyさん
2012/01/11(水) 22:26:31.01ID:???> 「499行目と500行目」
> 「1行目と2行目」
この二つの負荷には大差がないといっているんだろう。
本来の質問であるところの、
> 1〜500行の文字を取り出すとき
との負荷には大きな差があるよ。
固定長じゃない場合は、最後の2行を得るのが少し面倒だけど。
0654nobodyさん
2012/01/11(水) 22:33:40.13ID:???0655nobodyさん
2012/01/11(水) 22:33:46.01ID:???0656nobodyさん
2012/01/11(水) 22:45:01.77ID:???fileで全行読み込んでも良いよ。
そこがボトルネックになってから改良したら良い。
0657nobodyさん
2012/01/11(水) 22:47:30.54ID:???一応動くやつを作ってから速度測定して、
全体の中で時間掛かっているところに手を加えれば良い。
0658nobodyさん
2012/01/11(水) 23:02:44.07ID:tHZDD+V0「499行目と500行目」「1行目と2行目」この二つは差があるのでしょうか?という質問でした
説明不十分で申し訳ないです
やっぱりテキストファイルを固定長形式にするしか無いですかね?
この場合
100バイトの文字列
2Kバイトの文字列
4バイトの文字列
:
となった場合、全部2KBになって500行あったら1Mになってしまうので避けてたのですが
0659nobodyさん
2012/01/11(水) 23:06:53.90ID:???全て(1〜500行)のロードと2行のみでは負荷は違う。
可変長だったらindexをファイルの後方か先頭に配置して必要なところを読めば速いです。
0660nobodyさん
2012/01/11(水) 23:16:37.71ID:???そしたらメモリ管理など気にしなくて済むしキャッシュなども自動で使ってくれる
0661nobodyさん
2012/01/11(水) 23:39:54.74ID:GX2tXR1t0662nobodyさん
2012/01/11(水) 23:50:01.97ID:VbJoExbWすみません、今まで色々試しにやってて返事が遅くなりました
http://ja.wikipedia.org/wiki/Forkを参照に
#!/usr/local/bin/php -q
<?php
$pid = pcntl_fork();
if ($pid == 0) {
$j;
for ($j=0; $j < 10; $j++) {
printf("child: %d\n", $j);
sleep(1);
}
} else if($pid > 0) {
$i;
for ($i=0; $i < 10; $i++) {
printf("parent: %d\n", $i);
sleep(1);
}
print "wait begin.\n";
pcntl_wait($status);
print "wait end.\n";
} else {
die('fork できません');
}としました
0663nobodyさん
2012/01/11(水) 23:50:43.62ID:VbJoExbWchild: 0
child: 1
child: 2
child: 3
child: 4
child: 5
child: 6
child: 7
child: 8
child: 9
parent: 0
parent: 1
parent: 2
parent: 3
parent: 4
parent: 5
parent: 6
parent: 7
parent: 8
parent: 9
wait begin.
wait end.
のようになってparentがwikipediaのようにchildの間に入っておりません
"出力の順序はカーネルが決定する"とは書かれていますが、PHPではこのようなものなのでしょうか?
学習不足で申し訳ないです
0665nobodyさん
2012/01/12(木) 02:58:10.26ID:KRgm5yh10666nobodyさん
2012/01/12(木) 03:08:54.02ID:???0667nobodyさん
2012/01/12(木) 03:25:30.76ID:???そのコードでできたよ。
child: 0
parent: 0
child: 1
parent: 1
child: 2
parent: 2
(略)
child: 8
parent: 8
child: 9
parent: 9
wait begin.
wait end.
0669nobodyさん
2012/01/12(木) 03:43:15.46ID:???0670nobodyさん
2012/01/12(木) 03:52:56.74ID:???0671nobodyさん
2012/01/12(木) 04:51:39.62ID:???0676nobodyさん
2012/01/12(木) 13:02:25.38ID:???できる関数がありますが、これはPHPをCGIモードで
動かしている場合にのみ有効です。
通常はPHPをApacheモジュールとして動作させていることが
多いので、これが使えないケースが多々あります。
http://techblog.ecstudio.jp/tech-tips/php-multi.html
0677nobodyさん
2012/01/12(木) 13:15:01.92ID:???Perlで良いじゃん。
0678nobodyさん
2012/01/12(木) 13:19:01.14ID:???pcntl_fork関数は存在するし、forkも成功したように見えるけど、並列処理されないなんて結果になるということですか
0679nobodyさん
2012/01/12(木) 14:01:06.08ID:???俺は並列処理の事なんか分かっていないので、このやり方で合っているか分からないけれど
<?phpの後に、$time = time();
最終行に、echo 'time:' . (time() - $time) . 'sec' . PHP_EOL;を付けてみた
2chの改行規制で出力形式変えるけど結果は
child: 0 child: 1 child: 2
child: 3 child: 4 child: 5
child: 6 child: 7 child: 8
child: 9
time:10sec
parent: 0 parent: 1 parent: 2
parent: 3 parent: 4 parent: 5
parent: 6 parent: 7 parent: 8
parent: 9
wait begin.
wait end.
time:10sec
となった
>>676
http://www.php.net/manual/ja/pcntl.installation.php
にはCLI版も可能って書いてるんじゃないの?
>>675
ちなみに自分はcentOSです
0680nobodyさん
2012/01/12(木) 14:01:29.80ID:QAUYYhrI書き込むときの排他制御はどのようにやるのでしょうか?
0682nobodyさん
2012/01/12(木) 14:02:25.17ID:???0683679
2012/01/12(木) 14:02:52.80ID:???0684nobodyさん
2012/01/12(木) 14:10:41.80ID:???レンタルサーバーとかでは。
自宅で一人で使う目的だったらマルチスレッドをONにしてコンパイルすればいい。
しかしソースコードに汎用性が無くなる。
Curlをつかっとけ。5.3か5.2から標準で並列に使える。
0685nobodyさん
2012/01/12(木) 14:15:13.44ID:???0686nobodyさん
2012/01/12(木) 14:16:07.48ID:???プロセス制御機能を有効にするには、 configure のオプションに --enable-pcntl を付け、
CGI 版あるいは CLI 版の PHP をコンパイルする必要があります。
注意: 現在、このモジュールは非 Unix 環境(Windows)では動作しません。
http://www.php.net/manual/ja/pcntl.installation.php
■ このスレッドは過去ログ倉庫に格納されています