PHP質問・雑談スレ6【初心者お断り(ROM歓迎)】
■ このスレッドは過去ログ倉庫に格納されています
PHPに関する質問や雑談をするスレです。 初心者お断り(ROM歓迎)と書いてますが、初心者用のスレが用意されているからで、 難しい質問や話題をしなければいけないわけではありません。 PHPマニュアルの読み方を概ね理解していて、関数リファレンスが正しく読める方用のスレです。 PHP未導入の方や、手取り足取りが必要な初心者の方はム板のくだスレへどうぞ。 https://mevius.5ch.net/tech/ (【PHP】で板内を検索) 前スレ https://medaka.5ch.net/test/read.cgi/php/1538639036/ その他リンク ・PHPマニュアル https://secure.php.net/manual/ja/index.php ・コードテスト・貼り付け用 https://ideone.com/ ・プログラミングのお題スレ (求PHPer参戦) https://mevius.5ch.net/tech/ (お題スレで板内を検索) このスレで扱う話題 ・PHPのコード,設定や設定値に関する質問 ・常識的範囲内でのコードレビュー依頼・改良相談 ・PECL,PEARに関する質問 ・PHP新機能やPHP関連トレンドの話題 (FWや非公式ライブラリの話題や特徴比較は良いが使い方から先の話題は専スレへ) ・PHPのバグ発見報告・公式に報告する前の検証依頼 このスレで扱わない話題 ・直接関係ない○○特有の質問(専スレへ) (HH,エディタ,IDE,サーバ,OS,DB,SQL,FW,テンプレート,非公式ライブラリ・アプリケーション等) ・PHPの改造 今からPHP勉強してフリーランスデビュー目指して頑張ります ちな中卒30代プログラミング未経験 徳丸ひさびさに見たけど白髪増えてだいぶ老けたなぁ(´・ω・`) 相変わらずのPHPびいきなようで安心。 彼がいる限りまだまだ日本でのPHPは終わらんよ( ー`дー´)キリッ IDとパスワードのログイン方式でなく 電子証明書方式のログインサイトを作ってみたいのですが 具体的にはどうしたらいいんですかね? 素人が作ったら電子証明書使ってても穴あきそうだな 実績あるプロに任せろ こんなとこで質問するレベルのやつが作って良いものではないw そりゃ、ここの話題じゃないからな。 ヒント出してるだけマシだろ。 …まさか5ちゃんに書いて答えもらえるとマジで思ってたのか? >>1 東京三鷹の土井(剛)莉里子 https://i.imgur.com/Fbgp0yG.png 氏名■土井剛(莉里子) 生年月日■1994.3.7 前住所■〒181-0013 東京都三鷹市下連雀5丁目3 シティハイツ吉祥寺通り4階 性別■男(詐欺師のため、戸籍変更している可能性あり) Twitter■@copy__writing @kotobamemo_bot 疾患■性同一性障害(LGBT)、発達障害(ADHD)、アスペルガー症候群、統合失調症 ●一方的に好意を寄せる男性から相手にされないと嫌がらせを繰り返す ●某大学病院の精神科隔離病棟にて強制入院 ●骨が見えるほどのリストカット ●奇声をあげながら自室部屋のドアをナイフで突き刺す ●シティハイツ吉祥寺通り4階から飛び降り自殺 ●性転換手術(金玉を取る) ●トラブル...嫌がらせ、ハッキング、乗っ取り、たかり、脅迫、殺害予告...etc ●去年から今年にかけてyoutuber同士のトラブルの仲介に入り某大手youtuberから複数回に渡り1億近い慰謝料をふんだくる ●自宅の吉祥寺にいられなくなり、大阪に潜伏中(警察からも逃げている) 追記型の最新のログ10件を表示するために長めのログをfgetsで キューに10個いれてそれ以上あれば破棄していくという感じで $queue = array(); while (!feof($fp)) { array_unshift($queue, fgets($fp)); if (count($queue) > 10) array_pop($queue); } というようなコード考えたんですけど 初期値falseの$overflow変数を儲けて if ($overflow || count($queue) > 10) { array_pop($queue); $overflow = true; } のようにしたら$overflowがtrueの時点で countのところには行かないで認識あってますか? $overflow = trueよりcountのほうが遅いはずなので php5系使ってて配列操作は遅いので改善ポイントとして考えてます >>220 count()の実行回数を減らしても大して違いは無いと思うけどなぁ。 それより1行ずつ配列に入れるのをやめてfile()で一気に読み込んでから、array_slice()で最後の10行を残して、array_reverse()で反転させる方が早くないか? 遅いのはログの行数が多いからだと思うけど、あまり多いとfile()じゃメモリ消費も気になってくるけどね。 その場合はログのサイズを小さくすることを考える必要がある。デイリーベースにするとか。 キュー使うなら配列よりSplQueue使ったらええんちゃう 実装見たわけじゃないけど常識的にcountはO(1)だし多分内部のカウンタ見てるだけだから遅いってことはない ログを頭から読んでいって末尾10件を抽出するのが遅いって(O(N))のなら最新数件だけ別ファイルにする(O(1))かDB使った方(O(log(N)))がいい レスありがとうございました。なんか溜まってるログがないかと探して、 まだまだ少ないですが、6MB 3万行強ぐらいので試してみました。 結果countに関してはお二方のおっしゃる通り影響はないようです。 10回計測して、(ローカルの計測環境でPHP7なんですが) file avg: 0.02795 配列Queue(>>220 ) avg: 0.04602 SplQueue avg: 0.04344 キュー型にしない(最後の取り出す処理で若干こんがらがる) avg: 0.02981 といった感じになりました。3万行なら余裕ですが、fileはやっぱりメモリ食べますね。 最後のコードは、 $disp_num = 10 + 1; $bucket = array_fill(0, $disp_num, null); $pointer = 0; while (!feof($fp)) { $bucket[$pointer%$disp_num] = fgets($fp); $pointer++; } のようにしたものです。 配列の順番がぐちゃぐちゃになるので、最後少し苦労しますが配列に入れるだけなのでメモリも速度もいいですね。 (やってて気づいたのですが)+1にしてるのはfopenでfeofまでやると、 最後の空行が入ってしまうようなので+1にしてます。 このせいで、他の配列Queue版もSplQueue版も最後に1回pop処理が必要になったりして、ちょっといまいちな印象です。 fileは最後の空行は無視されていました。 ごめんなさい、嘘つきました。 よく見たらfileも最後の空行が入ってしまっていました。 さらにごめんなさい、ベンチで使ったやつはfileのあとにreverseもしてました。 実際はfileだけでログ取得箇所を示す配列のcount入れても、 もっと早くて0.022台〜0.025台です。 echo "str".$a-$b; PHP Deprecated: The behavior of unparenthesized expressions containing both '.' and '+'/'-' will change in PHP 8: '+'/'-' will take a higher precedence とかいうのが出た もうPHP8の季節なのかー >>223 file()は全部メモリに乗っけちゃうんだから、ファイルサイズ以上にメモリ消費するわな。 行数の多いファイルを頭から地道に読み込もうとすると、ループ内のほとんどの時間は無駄になっちゃうから、最後の数行だけ取る処理をlastコマンドに任せた方が早いんじゃないか。 いずれにせよログの巨大化回避の枠組みを作ることの方が先決だろう。 WEBプログラム板けっこう寂れちゃったんだな PHP7のバージョンアップで前バージョン動かなくなったりしたのが良くなかったんじゃ オワコンとまでは言わないがここを目指す技術者の減少が著しい 今はスマホやゲームから入ってそのままサーバが必要になれば KotlinやらSwiftやらC#で書くみたいな節があるし JSの進化とともに昔みたいにこってこてにサーバサイド書くこともなくなって 本当にデータの受渡しだけになってしまったし 共用サーバはPHPとPerlぐらいしか選択肢がなかったころに流行って PythonとRubyが加わってRoRでモダンなWebFWが完成して VPSやクラウドが登場して選択肢が増えていって PCが廃れスマホが主流になった現在、正直今更PHP?だもんな 寂しいけど俺も今からなら絶対PHPは勧めないよ 21世紀になったあたりの頃は 「未来はPCからEmbeded(モバイルなんて言葉はまだ無かった)までJAVAで統一されている」 って言われたものだが・・・ Javaはセキュリティ関連でイメージがすっかり悪くなってしまったからね Javaのインストールしたくないけど仕方なく入れてる人はわりと見る >>229 ログインしたあとは JSONとMySQLのやり取りだけだもんな サーバー側は得意なのでいいよ >>232 まだそんなこと言ってんの? オラクル製のじゃなきゃ無料で使えるだろ >>234 ライフサイクルが短いから使ってもすぐ上げなきゃいけないとかで実用的でない >>233 逆に、PHPなら書けるけどSwiftとかC#とか書けない場合、 今から新たに書くプログラムをPHPで書いてもいいのかな?今でも それとも時代に合わせて新たな言語覚えるべき? >>234 イメージが悪くなった, という話の流れなんだがな Javaは元々、冗長すぎてまともなプログラマからは嫌われていた。 JAVAが世界を席巻していた頃は まさか将来毎年のように新言語が 登場するようになるとは夢にも思ってなかった JAVAで世界は統一されると堅く信じていた >>236 PHPで全然かまへんで ただPHPでかけるがSwiftやC#でかけないなんてことはないと思うぞ (Webに限っては)その逆もしかり まあどっちが楽かっていう問題はあるけどね PHPはimportするパッケージ探すとこから始めなくていいことも多いしな PHPまでしかできない奴はc#は無理な奴かなり多い 動的型付け言語全般がタイプヒントつけるのがしんどい c#で何をするかによるが 少なくともVSで開発するGUIアプリは htmlとjavascriptの基礎があれば作れるだろう laravel使っているのですがphpかlaravelで下記のことはどうすればできますか? ページ内のボタンをクリック→データベースのテーブルを作成 CREATE TABLEとかのDDLは普通はマイグレーションで実行するよな APIで誰でも実行出来るようにするなんて普通はない 企業内閉鎖系ならまだしもネット接続でそんなの開放したらイチコロだな ちょっとfuel phpの仕様でdoc読んでも見当たらないので教えてほしいんだ。。 fuel/app/config/routes.phpで return array( 'api/hoge' => 'hoge', 'api/hige' => 'hige', 'api/hage' => 'hage', ); ってなってるのを return array( 'api' => array( 'hoge' => 'hoge', 'hige' => 'hige', 'hage' => 'hage', ), ); って出来る? 目的としてはクソみたいに汚くなったルーティングを整理したいからで ソース読んだ限りだと正規表現を利用する書き方的なことをしないと ダメっぽい気がしたんだが一応確証がほしい そんな事より なんでarrayじゃなくて[]で書かないの? >>249 無知乙 >>250 グラブルが2019時点でいまだにfuel採用しているし豚みたいなLaravelより軽いし >>249 みたいなスクール上がりの馬鹿なカスが寄り付きづらいから割とピンピンしてる >このスレで扱わない話題 >・直接関係ない○○特有の質問(専スレへ) > (HH,エディタ,IDE,サーバ,OS,DB,SQL,FW,テンプレート,非公式ライブラリ・アプリケーション等) https://medaka.5ch.net/test/read.cgi/php/1321843505/ ageて質問したら誰か答えるんじゃね? マイナーなFWしかも5chみたいな人いないとこで質問してんだから 答え返ってこないことは覚悟してくれ ffmpegコマンドを叩いて変換待ちってのはどんな感じに実装すればいいですか? >>253 裏でやらせておいて、出来上がったら教える感じで実装する >>254 マルチスレッドとかで並列処理をするかんじですかね? pthreadとかでいいのかな? それでタイムアウト対策とかはどうしたらいいんでしょう? flushとかそのへんを使う感じですか? >>255 バックグラウンドで動く別プログラムをsystem関数で呼ぶとかする タイムアウトも別プログラムに勝手にやらせる 最近のフレームワークならキューに入ったジョブを実行するシステムがあるだろう ffmpeg は処理途中で標準出力するから同期処理は無理じゃねえ。 >>259 標準出力をファイルに落として、のぞき見 公式のwindows版PHPってあれMSがビルドしてたのか 野良ビルドよりは安心だけどまあ正直どうでもいいっすねw 公式が書き換えられたりしても気づくことなく 公式にあるってだけでホイホイダウンロードしちまうだろうし MS、なんでPHP8ビルドしないん(´・ω・`)? MSがPHPを切ったのではない PHPがMSを捨てたのだ PHPってなんで未だにasync awaitないの? C#、JavaScript、Pythonはあるでしよ Javaは無いみたいだけど コールバック地獄なしで非同期コード書きたい >>267 forkすればいいじゃん なんでいちいち待つの? >>268 Guzzleのpromiseも curl_multiも知らない男の人って・・・ forkって 親プロセスと変数は共有出来ない(子プロセスの変数を変えても親プロセスの方はそのまま) その一方MySQLを使ってると子プロセスが終了時に接続がクローズされる 何も良いことがなさげなんだが 親プロセスと変数が共有できないなら 普通にexecする方がマシじゃね? それだけじゃなく 実行時間が短い処理には プロセス生成はオーバーヘッドが大きすぎる 「hogeしか出来ない人」 が存在する言語ってもしかしてphpしかなくない? マジで? 言語の欠点をどうやって補うかって話じゃなくただ言語の欠点をあげつらうだけなら、 普通に他の言語使えば?としか思わんのだが 他の言語使えないというならお前が無能なだけだろうと PHPはNodeと違ってイベントループがコア機能として組み込まれていないから Guzzleの場合、非同期処理の恩恵を得るには Promiseの配列(またはイテレータ、ジェネレータ)を用意して 適切な場所でそれをwaitしてイベントループを回す必要がある 場面によっては非同期の恩恵を得られない 言語に非同期処理が組み込まれてないのもこの辺が理由か イベントループって、 リクエストの度にプロセスを初期化するPHPの構造と合わなそうだし 質問させてください。 今PHPで3択クイズを作ってます 配列に正解が1つと間違いが2つ入ってます この3つをランダムに表示させて答え合わせしたいのですが やり方がわかりません。先輩方、ご教授お願いします。 >>274 完全なランダムはPHPでは使用できません。 PHP以外の言語でも完全なランダムは不可能です。 あと30年ほど経てば、利用できる可能性があります。 >>275 お前リアルでもそんなこと言ってんの?w $a[0] = "正解"; $a[1] = "間違い1"; $a[2] = "間違い2"; shuffle($a); ここまでは考えたのですが これをどうやって正解判定するのか 案外難しいですねこれ・・・ >>278 ありがとうございますた! ちなみにくだスレないです(´;ω;`) file_get_contentsでtwitterを読んでrssにするプログラムが いつの間にか動かなくなっていたので調べたところ、 ツイッターのページがほぼJavaScriptのみになっていてツイートをHTMLとして含まないようになっていました もうtwitter APIを介して取得するしかないのでしょうか? >>281 twitterをRSS化するサービスがいくつもあったので、それを使うことにしました 失礼しました phpで掲示板を作ってます threadテーブルとpostテーブルがあります threadテーブルのカラム ・thread_id(スレッドID) ・time(スレッド作成タイム) ・title(スレッドタイトル) postテーブルのカラム ・thread_id(スレッドID) ・name(投稿者) ・res_no(レスナンバー) スレッド一覧を表示する際、タイトルの横に投稿者を付けたいので、以下のSQLを発行しました sql = "SELECT t.title, p.name FROM thread t JOIN post p ON t.thread_id = p.thread_id WHERE p.res_no = 1 LIMIT 0,10" ※行 0 - 9 の表示 (合計 10, クエリの実行時間: 0.0029 秒。) スレッド作成順にソートしたいため、ORDER BY句を入れると sql = "SELECT t.title, p.name FROM thread t JOIN post p ON t.thread_id = p.thread_id WHERE p.res_no = 1 ORDER BY t.time DESC LIMIT 0,10" ※行 0 - 9 の表示 (合計 10, クエリの実行時間: 0.6489 秒。) と実行時間が大幅に上がってしまいました 実行時間を抑えるためにどうしたら良いですか? WSL2のDockerで Windowsのファイルシステム上にあるphpファイルを読ませると 遅すぎて使い物にならない 従来のHyper-Vバックエンドの方がまだマシ https://github.com/docker/for-win/issues/7719 WSL2のWindowsファイルシステムが遅いせいらしい Unisonで同期すれば速いけどちょっと最初の設定が面倒くさい >>274 2週間以上前の質問にレスするのもアレだが2次元以上の配列を使えば良いだけでは? $arr = [ 1 => [ 'question' => '昼間の空は何色?', 'choice' => [ 'A' => '青', 'B' => '赤', 'C' => 'ピンク', ], 'correct' => 'A', ], 2 => [ 'question' => 'てめぇの血は何色だぁ?', 'choice' => [ 'A' => '青', 'B' => '赤', 'C' => 'ピンク', ], 'correct' => 'B', ], ]; $qid = array_rand($arr); $question = $arr[$qid]['question']; // 問題 $choice = $arr[$qid]['choice']; // 選択肢 $correct = $arr[$qid]['correct']; // 正解 unset($arr[$qid]); // $qidを何らかの方法で保存しておいて、出題が終わったものは削除すりゃいい >>287 のインデントが消えて見にくいだろから、インデント部分を全角スペースに置き換えたら見やすくなるか? shuffle()は駄目だな 配列のキーがリセットされてしまうから、287みたいな事ができなくなるので $arr = [ 1 => [ 'question' => '昼間の空は何色?', 'choice' => [ 'A' => '青', 'B' => '赤', 'C' => 'ピンク', ], 'correct' => 'A', ], 2 => [ 'question' => 'てめぇの血は何色だぁ?', 'choice' => [ 'A' => '青', 'B' => '赤', 'C' => 'ピンク', ], 'correct' => 'B', ], ]; windows consoleでfgets(STDIN,4096)で 入力待ちにしたいのですが次に進んでしまって入力待ちになりません この間まで問題なかったのですが proc_openあたりの関数使ってからおかしくなった気がします 設定でも書き換わったのか再起動しましたが直りません 何か修正する方法知ってる方いたら教えて下さい なんか似たような報告ありました https://stackoverflow.com/questions/59092779/has-php-7-4-broken-fgetsstdin PHPのバグっぽいですね? ちょうどPHP7.4にしたのでそれのせいだったようです 最新の7.4.11にしたら問題なくなりました テキストファイル保存して適宜読み込もうと思ってる テキストファイルのコンテンツは1行のものもあれば複数行のものもある うまい具合に混在させるにはどういう仕様にしたらいいかな? ぱっとおもいついたのは次のような書式 AAA BBB CCC [multi1] DDD EEE [/multi1] FFF GGG [multi2] HHH III JJJ [/multi2] KKK これより優れた書式ってあると思う? >>291 csv tsv xml json 好きなの選べ >>291 いくらでもあるが 思ったら既に挙げられてるか jsonはねぇ・・・ 見やすいことは見やすいんだけど いざ手書きで記述するとなると括弧が結構面倒くさくて 全部単行にして複数行へは実態への参照だけ置くとかもあるね 用途次第かなと Worldwide, Nov 2020 compared to a year ago: Rank Change Language Share Trend 1 Python 30.8 % +1.8 % 2 Java 16.79 % -2.3 % 3 JavaScript 8.37 % +0.3 % 4 C# 6.42 % -0.9 % 5 PHP 5.92 % -0.2 % 6 C/C++ 5.78 % -0.2 % 7 R 4.16 % +0.4 % 8 Objective-C 3.57 % +1.0 % 9 Swift 2.29 % -0.2 % 10 TypeScript PHP8とLibreSSLって相性悪い? makeしたらOPENSSLでエラー ソースコードopenssl.cでLibreSSLを除外するよう、イジったらmake testでエラー >>291 単に改行を含みたいだけならシングルカラムのcsvでいいと思いますよ phpとpythonはどっちがつおいですか?(´・ω・`)c とうとうPython環境作りましたけどPHPと同じことするんだったらちょっとつまらないです ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる