【PHP】下らねぇ質問はID出して書き込みやがれ 129
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001nobodyさん
2013/08/05(月) NY:AN:NY.ANID:dIT4JFvF過去スレ、関連スレ、FAQなどは>>2-10辺り
次スレは>>980が立てる。10分以内に立たない場合、宣言してから立てたい人が立てること。
◆前スレ
【PHP】下らねぇ質問はID出して書き込みやがれ 128
http://kohada.2ch.net/test/read.cgi/php/1369576918/
◆質問用テンプレ
【OS名】CentOS
【PHPのバージョン】5.3
【連携ソフトウェア】MySQL ImageMagick
【質問内容】
◆質問する時の注意
・ スレを上げて自分のIDを表示させること。(メール欄に何も記述しない。専ブラのsageチェックを外す)
・ 己の行った操作、変更などを詳しく明記すること。
・ エラーメッセージはそのまま表記すること。「エラーが出ます」だけでは回答不可。
・ 事前に関連リンクの公式マニュアル、リファレンス本くらいはちゃんと目を通しておくこと。
(PHPで最良の教本はこの公式マニュアル。市販の書籍は嘘が多いので鵜呑みにしない。)
◆質問後の注意
・2回目以降は最初に質問した際のレス番号を入れて、偽者防止に必ずIDを表示させること。
・解決しなくても回答をもらった場合はお礼を言うこと。
(荒らし、煽りは除く。煽られたときも、無闇に反論せずスルーすること。)
◆回答者への注意
・誰にレスしているのか分からないと困るので、>>(アンカー)をつけて回答すること。IDを出すこと。
【その他諸注意】
・SQL・正規表現・PEAR・テンプレート(Smarty等)・フレームワークは各該当スレへ
・全員IDを出すことが推奨されるようになりました。IDなしは原則スルーすること。
0896nobodyさん
2013/09/15(日) 13:07:06.23ID:???0897nobodyさん
2013/09/15(日) 15:15:04.94ID:???0898nobodyさん
2013/09/15(日) 17:50:29.80ID:???0899nobodyさん
2013/09/15(日) 17:52:57.87ID:???ブラウザに普通に返すレスポンスのエンコーディング変換ぐらいたかがしれてる。
0900nobodyさん
2013/09/15(日) 18:26:20.42ID:???例えそれが事実だとしても根拠となる数値を出さない限りお前のくだらない思い込み。
Twitterでやってろ。
0902nobodyさん
2013/09/15(日) 21:32:13.31ID:???0903nobodyさん
2013/09/15(日) 22:36:33.28ID:???ベンチ結果は?
0904nobodyさん
2013/09/16(月) 00:01:45.74ID:K7nyvuoc0905nobodyさん
2013/09/16(月) 06:06:04.38ID:dXmcZfw01つのwebページ(Aとする)内で、
8つの異なるページ(Aとは別ドメイン)から
スクレイピングしたいのですが、どうやるのかわかりません。
8つともタグの構造は全く同じなので、全く同じ処理をしたいのですが、
file_get_contentsではなく、Curlでしょうか。
このページの内容だと具体的にどう記述していいのかわからなかったです・・。
http://nanoappli.com/blog/archives/5743
・行ってみたこと
file_get_contentsで8回処理を書いた
→見た目は思い道りにできたがページの表示が重すぎる
宜しくお願いいたします。
【PHPのバージョン】5.3
0906nobodyさん
2013/09/16(月) 06:19:29.70ID:???「ブラウザに普通に返すレスポンス」のことを話してるのに「ベンチマーク」がどうして必要なの?
そりゃ何百万バイトもmb_convert_encoding関数にかけてたら時間はかかるでしょ。
<?php
set_time_limit(0);
$time = 0.0;
for ($i = 0; $i < 10000; $i++) {
$t1 = microtime(true);
$tmp = mb_convert_encoding($str, 'SJIS-win', 'UTF-8');
$t2 = microtime(true);
$time += $t2 - $t1;
unset($t1, $tmp, $t2);
}
printf("10000回での算出平均: %f sec", $time / 10000);
?>
0907nobodyさん
2013/09/16(月) 06:20:15.52ID:???続き。
$strはこのスレの記事を全表示したときのHTMLな。
これをCorei7のローカルマシン上のPHP5.4で走らせたら 0.003398 sec だった。
ideoneとかcodepadではページ量的な問題で出来なかったので割愛。
この 0.003398 秒のために頑張る気になれる?
ちなみにUTF-8で一貫してWebアプリケーションを作成して、ガラケーなどの端末向けに
<?php ob_start() ?>
....
....
<?php
echo auガラケー ? mb_convert_encoding(ob_get_clean(), 'SJIS-win', 'UTF-8') : ob_get_clean();
ってやるのが一般的な手法。
実際はフレームワーク任せだと思うけどやってることはこういうイメージ。
逆にエンコーディング変換にコストがかかるとかいってそれぞれロジックを組む方がバカバカしいと思わない?
str_replaceやexplodeなどメジャーな関数を全部鬼車系の正規表現関数に書き換えなければならないってことになるよ。
0908nobodyさん
2013/09/16(月) 06:58:01.02ID:???並列処理をやるならcURLが定番かな
http://php.net/manual/ja/function.curl-multi-init.php#refsect1-function.curl-multi-init-examples
例は curl-multi でググれば大量で出る
0909nobodyさん
2013/09/16(月) 07:06:50.99ID:???こっちと比べてもらえば分かると思うけど、このサンプル作った人全然分かってないよ。
http://qiita.com/Hiraku/items/1c67b51040246efb4254
http://qiita.com/YukiAsu/items/8dc1594ac9406e446226
>>908
個人的にはfsockopen+stream_set_blocking推しかなぁ。
ガチ勢の方はマルチプロセスじゃ満足できなくてマルチスレッドを実現するためにpthreads入れたりしてるみたいだけどw
0910nobodyさん
2013/09/16(月) 07:45:55.63ID:???fsockopen()の時点でブロッキングされない?
stream_socket_client()なら非同期で接続できるけど
どちらにしてもHTTPを自分で面倒見ないといけないのは面倒だな
0911nobodyさん
2013/09/16(月) 07:51:52.82ID:???0913nobodyさん
2013/09/16(月) 09:32:47.72ID:???0914nobodyさん
2013/09/16(月) 11:29:30.02ID:8/BhI2+E自作クラス内でPDOを使いたいのですが、呼び出し元ですでに呼び出してあったらそれを使い回したいと考えています。
以下のコードで実現できるのですが、これって真っ当でしょうか。何かセオリー等があったらアドバイスほしいです。
class HogeClass
{
private $pdo;
public function __construct()
{
global $pdo;
if (isset($pdo)) {
$this->pdo = &$pdo;
} else {
$this->pdo = new PDO(〜〜〜);
}
}
}
0916nobodyさん
2013/09/16(月) 11:53:16.76ID:???あっ・・・(気づかなかった)
PHPにマルチスレッドはおろかマルチプロセスすらやらせることが誤っている(開き直り)
0917nobodyさん
2013/09/16(月) 12:01:53.80ID:???頼むからグローバル変数使うのだけはやめてお願い・・・
個人的にはシングルトンにすればいいかなーと思う。
class Hoge {
____
____private static $instance;
____private $pdo;
____
____public static function getInstance() {
________if (self::$instance === null) {
____________self::$instance = new self;
________}
________return self::$instance;
____}
____
____private function __construct() {
________$this->pdo = new PDO(〜);
____}
____
}
$hoge1 = Hoge::getInstance();
$hoge2 = Hoge::getInstance();
// ↑この2つは完全に同じものを指していることになる
コンストラクタをprivateにしてもクラス内からの呼び出しならば動くってこと意外と知らない人いたり。
0920nobodyさん
2013/09/16(月) 13:16:51.44ID:???Twitterのライブラリ作ってるんだけど、fsockopenをstream_socket_clientに変えただけで非同期連続リクエストだいぶ速くなってわろたwwwありがとうwww
0921905
2013/09/16(月) 13:31:43.95ID:v3UCvtZRありがとうございます。
自分にはまだハードルが高いのかもしれません。。
でもなんとかやってみます!
0922nobodyさん
2013/09/16(月) 14:16:27.50ID:???0923nobodyさん
2013/09/16(月) 14:26:25.72ID:???これ酷くない?
http://qiita.com/mpyw/items/1cf314b984a6d26e6ae6
0924nobodyさん
2013/09/16(月) 14:31:32.56ID:???回答お待ちしております
0925nobodyさん
2013/09/16(月) 15:13:12.06ID:SHQfZLVK途中から変なの入ってきてワロタ
phpでやることじゃないのに必死すぎるわ
0926nobodyさん
2013/09/16(月) 15:17:55.94ID:???3行で出力まですればいいの?
foreach ($ary=array("○", "○", "○", "△", "△", "×") as $val1) foreach ($ary as $val2) $a[$x=$val1>$val2?$val1.$val2:$val2.$val1] = isset($a[$x]) ? ++$a[$x] : 1;
arsort($a);
print_r($a);
0928nobodyさん
2013/09/16(月) 15:23:58.96ID:???0929926
2013/09/16(月) 15:41:13.08ID:???こうすれば2行になるか・・
でも短くは書けないなぁ。
0930nobodyさん
2013/09/16(月) 15:50:23.90ID:???0931nobodyさん
2013/09/16(月) 16:01:53.80ID:???0932nobodyさん
2013/09/16(月) 16:02:08.39ID:???0933nobodyさん
2013/09/16(月) 16:08:31.95ID:???逆はその言語知ってる人にとっては回りくどいし汚くみえるけど対応可能
C言語の流れを汲んでてよかったね
0934914
2013/09/16(月) 17:20:50.83ID:8/BhI2+Eこんなインスタンスを1つしか作らせない技があったんですね。
これなら異なるクラス間でPDOのインスタンスを共有できますね。
使わせていただきます、ありがとうございました。
#ついでで失礼ですが、こういったテクニック・パターンが学べる
サイトや書籍で何かオススメがあったら教えてください
0935nobodyさん
2013/09/16(月) 17:41:43.55ID:???もっと見るおして書籍選びます
デザインパターン GoF
って入れてみます
0936mなんとか
2013/09/16(月) 18:39:58.30ID:???これとは関係ない例だけど、PDOを扱うなら是非見ていただきたいものがあるのでリンク貼っときます。
飽きるぐらい貼りまくったけど自重しませんw
http://qiita.com/mpyw/items/b00b72c5c95aac573b71
>>912に個人特定されてるからもう何も気にしなくていいやw
0937nobodyさん
2013/09/16(月) 18:41:35.76ID:???0938nobodyさん
2013/09/16(月) 19:27:15.72ID:???0939em1-113-71-98.pool.e-mobile.ne.jp
2013/09/16(月) 19:40:49.51ID:3h/0BZKN0940nobodyさん
2013/09/16(月) 19:55:51.85ID:???0941905
2013/09/16(月) 20:41:20.71ID:v3UCvtZR>>908さんに教えていただいた下記方法でcurl-multiを使いたいのですが、
http://php.net/manual/ja/function.curl-multi-init.php#refsect1-function.curl-multi-init-examples
得られた各URLのソースに全く同じ処理(主に置換)を行いたいのですが、
どう続けて(つなげて)良いのかわかりません。
var_dump($result);を見ると、配列の中に配列が入っているようで。。
str_replace()等をしたいのですが、$resultで得られた配列の中の配列の[content]に
全てstr_replace()をかけ、最後にforeach等でechoしたいのですが、
どう書いたらよいのでしょうか。
わからないのが、$resultで得られる配列にstr_replace()を行う部分です。
宜しくお願いいたします。
0942905
2013/09/16(月) 20:46:23.70ID:v3UCvtZRこっちのソースでした
http://techblog.yahoo.co.jp/architecture/api1_curl_multi/
0944m
2013/09/17(火) 01:50:55.16ID:???array_map+クロージャで実装するなら
$result = array_map(function ($item) {
____$item['content'] = str_replace(〜, 〜, $item['content']);
____return $item;
}, $result);
分かりにくかったら普通にforeachでもOK
foreach ($result as &$item) {
____$item['content'] = str_replace(〜, 〜, $item['content']);
}
unset($item);
もしくは
foreach ($result as $key => $item) {
____$item['content'] = str_replace(〜, 〜, $item['content']);
____$result[$key] = $item;
}
のどちらか。参照渡しでいく場合は最後にunsetするのを忘れずに。
個人的には一番最初の例がオススメ。
0946nobodyさん
2013/09/17(火) 06:28:06.82ID:???【PHPのバージョン】5.3
【連携ソフトウェア】SqLite
$sql = "SELECT * FROM Review WHERE EXISTS (SELECT * FROM Review WHERE Number = ? AND IP = ?)";
$query = $dbh->prepare($sql);
$query->execute(array($Number,$IP));
$res = $query->fetchAll(PDO::FETCH_ASSOC);
IPとNumberがDBに入ってなかった場合にFALSEを返して貰いたいのですが、
Fatal error: Call to a member function fetchAll() on a non-object in
のエラーが出てしまいます。
どこが駄目なのでしょうか?
0947nobodyさん
2013/09/17(火) 06:28:42.59ID:f+3jmrkPよろしくお願いしますm(_ _)m
0949m
2013/09/17(火) 06:52:07.27ID:???これそもそもprepareの段階で失敗しているのでは?
エラーモードをPDO::ERRMODE_EXCEPTIONに設定しておけばいちいちFALSEかどうか調べずにコーディング出来るのでラクですよ。
try {
____
____$dsn = 'sqlite:〜';
____$options = array(
________PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
________PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
____);
____$pdo = new PDO($dsn, '', '', $options);
____
____$sql = 'SELECT * FROM Review WHERE EXISTS (SELECT * FROM Review WHERE Number = ? AND IP = ?)';
____$stmt = $pdo->prepare($sql);
____$stmt->execute(array($Number, $IP));
____
____foreach ($stmt as $row) {
_______// $rowでなんかやる
____}
____// もちろん$stmt->fetchAll()としても2次元配列で全件取得できるが、foreachで回す場合は$stmtを直接回したほうがいい
____
} catch (Exception $e) {
____
____echo $e->getMessage();
____
}
0950nobodyさん
2013/09/17(火) 06:53:44.48ID:???0951nobodyさん
2013/09/17(火) 06:58:29.97ID:???追記。
SQLite2使ってる場合は不可能ってことで。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1281541482
0953nobodyさん
2013/09/17(火) 07:22:14.90ID:???0954946
2013/09/17(火) 07:29:14.10ID:f+3jmrkPありがとうございます。
参考にさせて頂きますm(_ _)m
0956nobodyさん
2013/09/17(火) 09:08:36.32ID:???本日のNG推奨
ID:f+3jmrkP
0957nobodyさん
2013/09/17(火) 11:20:09.81ID:???mySQL
OraCle
0959nobodyさん
2013/09/17(火) 11:49:33.11ID:???SQLiteにもメリットはあるみたいだけど
http://www.cpa-lab.com/tech/046
でもやっぱMySQL安定かなぁ
0960nobodyさん
2013/09/17(火) 11:52:37.27ID:???名前空間を汚さないという理由で1番目が好きなんだけどねぇ。速さで言えば2→3→1だけど。
2番の場合はunsetしないと後に$itemという変数が別に登場したときにおかしなことになったりするから、
とりあえず参照渡しforeach直後にunsetするクセをつけておけば問題ないんじゃないかと思う。
http://qiita.com/qckanemoto/items/c6d8ea00c57640c52cd8
0961nobodyさん
2013/09/17(火) 12:51:51.05ID:???0963nobodyさん
2013/09/17(火) 13:38:54.12ID:???array_* の引数の順番がみんなカオスだわ
無名関数の宣言が長すぎるわ
丸括弧とブレースの垂れ流しになるわで
書いてていまいち楽しくない
0964nobodyさん
2013/09/17(火) 13:42:05.39ID:???0965nobodyさん
2013/09/17(火) 13:45:18.94ID:???0966nobodyさん
2013/09/17(火) 14:28:03.24ID:waeuCh060967nobodyさん
2013/09/17(火) 14:30:13.23ID:???もしarray_mapがarray_walkみたいに受け取る配列が1つならば順番逆だったかもしれないね。
可変長引数になってるからやむを得ずこうしたと見て取れる。
array_mapやarray_walk_recursiveって結構出番あるけどarray_walkはただのforeachの劣化だと思ってる
0969nobodyさん
2013/09/17(火) 23:03:40.68ID:???気が向いた奴が答えるって程度の話だろうが
0970nobodyさん
2013/09/17(火) 23:12:31.45ID:???0971905
2013/09/17(火) 23:52:28.24ID:H1oQybix本当に有難うございます。
これからトライしてみます!
至らない文面や単語から、やりたいことを察してくださり有難うございます!
0972nobodyさん
2013/09/18(水) 00:46:58.39ID:???ここには理不尽に叩かれても大丈夫な人たちが来るのかな()
0973nobodyさん
2013/09/18(水) 01:05:20.55ID:???>2番の場合はunsetしないと後に$itemという変数が別に登場したときにおかしなことになったりするから、
使う前に変数を初期化するのはプログラミングの当然のお作法では?
0974905
2013/09/18(水) 01:05:46.12ID:byJ8EIWf>>944さんの 2番目の方法を行ってみたのですが、複数のURLの内容ではなく
1つのURLのソースしか取得できなていなくて、どうすべきかがわかりません。。
↓ここにソースを書きました
http://jsfiddle.net/eTSyy/
質問1 上記ソースで$itemをvar_dumpをすると対象URL1の内容しかでてこないのですが、対象URL2の分はどう記述すれば出せるのでしょうか
質問2 上記foreachの結果をechoする為には、$itemを再度foreachするという事でしょうか
しつこくてすみません・・宜しくお願いいたします。
0975nobodyさん
2013/09/18(水) 01:24:27.23ID:majtFbBK速度を上げたいならCURL使え。
PHPはマルチスレッド不可能だが
CURLは非同期で複数同時に通信可能。
0976nobodyさん
2013/09/18(水) 01:27:33.80ID:???初期化が「unset」を含んでいるならいいんだけど、そうじゃない場合は・・・
<?php
$arr = range('A', 'C');
foreach ($arr as &$item) {
____$item = str_repeat($item, 2);
}
foreach ($arr as $item) {
____echo $item . PHP_EOL;
}
これで
AA
BB
CC
が表示されるとか思っちゃうならお間抜けさんだろうね。
http://codepad.org/CKQZIFDq
いちいち変数初期化する前に再三「unset」とか呼ぶ人いないでしょうに・・・
だから普通はループ抜けた後にしておくのが賢い。
0977nobodyさん
2013/09/18(水) 01:32:41.28ID:???明らかにvar_dumpするもの間違えてるよね。
<?php
//↓ここからが不明です+++++++++++++++++++++++
$search = array('〜','〜');//置換対象1
$replace = array('〜','〜');//これで置換1
foreach ($result as &$item) {
____$item['content'] = str_replace($search, $replace, $item['content']);
}
unset($item);
var_dump($result);
0979905
2013/09/18(水) 02:28:41.81ID:byJ8EIWfその通りにやるとNULLになります。。orz
0980nobodyさん
2013/09/18(水) 02:44:51.89ID:???var_dump($item);
ってしてるんじゃないの?
var_dump($result);
だよ?
0981nobodyさん
2013/09/18(水) 02:46:35.62ID:???というかNULLが出るだけで済むんだったらerror_reportingでE_NOTICE非表示になってるね。
デバッグ環境としては全てのエラーを出すほうが望ましいから
error_reporting = E_ALL | E_STRICT
を設定推奨。
http://blog.thingslabo.com/archives/000184.html
0983905
2013/09/18(水) 03:13:19.10ID:byJ8EIWfはい。
//↓ここからが不明です+++++++++++++++++++++++
$search = array('〜','〜');//置換対象1
$replace = array('〜','〜');//これで置換1
foreach ($result as &$item) {
$item['content'] = str_replace($search,$replace,$item['content']);
}
unset($item);
var_dump($results);
でやってます。。
>>981
わかりました。php.iniいじってみます
0984905
2013/09/18(水) 03:21:04.50ID:byJ8EIWf設定を変更しました。
エラー内容が
Notice: Undefined variable: results in /home/users/0/ドメイン/web/curl2.php on line 70
NULL
に変わりました。
0985905
2013/09/18(水) 04:19:34.30ID:byJ8EIWf再度現状をお伝えしますと↓の状態です
http://codepad.org/952NbqnX
2つめのURLのコンテンツのみ取得する(1つめも取得したいが方法がわかりません)
宜しくお願いいたします。
0986nobodyさん
2013/09/18(水) 05:02:55.36ID:???連投しまくってスレの私物化か
気持ちわる
0987nobodyさん
2013/09/18(水) 05:56:31.07ID:???関数内では
// 結果返却
return $results;
ってしてるけどグローバルスコープでは
$result = getMultiContents($urlList);
ってしてるから当然グローバルスコープに存在する変数は $result だよね。
sがついてるかついてないかの違い。
Undefined variable: results in /home/users/0/ドメイン/web/curl2.php on line 70
↓
未定義の変数: results /home/users/0/ドメイン/web/curl2.phpの70行目
他の罵声浴びせてるだけの人みたいにあんまり厳しいこと言いたくないけど、
正直これぐらいコード目の前にあるなら本人が気づいてほしい。
英語苦手でエラーメッセージが分からなかったらググるぐらいしてほしい。
プログラミング云々以前の問題だと思う。
0988nobodyさん
2013/09/18(水) 05:58:31.49ID:???0990nobodyさん
2013/09/18(水) 10:14:01.99ID:???0991nobodyさん
2013/09/18(水) 10:15:08.94ID:???0993nobodyさん
2013/09/18(水) 10:21:12.34ID:???0994nobodyさん
2013/09/18(水) 10:22:09.00ID:???ベンチマーク取ってないけど
pthreads>>>絶対に超えられない壁>>>pcntl≒proc_open≒popen>cURLマルチ>stream_socket_client
って感じだと思う。
pthreadsはプロセスじゃなくてスレッド制御だからぶっちぎりで当たり前。
0995nobodyさん
2013/09/18(水) 10:23:29.76ID:???一般的なキーワードでggってヒットするPHPのブログ記事ってだいたいクッソ古い情報掲げてたり非効率なコード書いてたりするよねw
レス数が950を超えています。1000を超えると書き込みができなくなります。