【PHP】下らねぇ質問はここに 9

■ このスレッドは過去ログ倉庫に格納されています
2017/12/20(水) 18:00:20.28ID:1xaO/YRR0
PHPに関する質問スレです

前スレ
【PHP】下らねぇ質問はここに書き込みやがれ 8
http://mevius.5ch.net/test/read.cgi/tech/1489506082/

次スレは>>980以降
本文の1行目に以下を追加すること
!extend:on:vvvvv:1000:512
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
2018/07/09(月) 18:09:44.47ID:U1ydYGt1d
開発を
error_reporting=E_ALL(PHP5.4以前ならE_ALL|E_STRICT)
でしてなかったりすると環境移行でエラー出まくったりするかもな
初心者はまずエラーを正しく出すところから学習しないとな
2018/07/10(火) 02:26:11.43ID:wjyVwwQl0
>>248
同じインスタンスで動くならそりゃそうだろって話だけど、virtual はともかく SSI が同じインスタンスで動かすのが当たり前かと言われれば微妙じゃね?
$_GET みたいなスーパーグローバルとかどうなっちゃうんだよって問題もあるし、実際出力バッファはまぜこぜになって使い物にならないわけだし。
わざわざ SSI でやるのなんて、他所の誰かが作った全く関係ないものを自分の処理と隔離してページ上に取り込みたいなんてケースだったりするわけで、隔離できないならあんまり意味が無いというか。
そういうものだということが分かってりゃやり方考えるからいいんだけど、なんでそうする?っていう仕様だと思う。
PHPそのものの問題じゃないであろうこと引っ張ってすまないけど。
2018/07/10(火) 12:06:55.09ID:0tZHlanb0
前バージョンと同じように、必要なモジュール・ライブラリがロードされていて、
基本的な環境に差異がないのを前提とすれば、
あとは廃止変更された機能や関数が影響を受ける。
なので動かない場所が出てきて、書き換えが必要になる場合はあるが、
それはコードの1%にも満たないぐらいの量のはずだから、
大規模なアプリケーションでも書き換えに1日はかからないだろう。
2018/07/10(火) 16:01:47.12ID:Whumi4Kc0
>>256
> 他所の誰かが作った全く関係ないものを自分の処理と隔離してページ上に取り込みたい
SSIを使う理由になってないしSSI以外の知識がないだけ
サーバーの知識が多少ある人間なら今この時代にSSIを使うのがいかに馬鹿げているかすぐ分かる
2018/07/10(火) 16:24:53.40ID:XJrRuzBNd
SSIもhtaccessも無駄にサーバーに負荷をかけわ、遅いわ、セキュリティリスクの管理もしにくわで何1つ良いことないから無効にしろと大昔に教わったな
結構最近でもSSIインジェクションで資生堂の小会社がが情報漏えい起こしてたけど資生堂みたいな大きなところが未だにSSI使ってることに驚いた
includeしたいだけなら他にいくらでも代替案あるのにさ
2018/07/10(火) 16:34:05.74ID:MaGnmy4dM
SSIインジェクションやらかすようなやつはSQLインジェクションだってやらかしかねないんだから、それはSSIを使わない理由としては弱いでしょ。
261デフォルトの名無しさん (スププ Sd7f-cREG)
垢版 |
2018/07/10(火) 16:43:24.55ID:b+YyloMOd
素人だからよく分かんないんだけど
ssiでincludeするのとhtmlで<iframe> or phpでfile_get_contents するのは何が違うの?
ssiを使う理由って何?
2018/07/10(火) 17:02:12.57ID:MaGnmy4dM
>>261
旧来からのスタイルを踏襲しているとか、
SSIはPHP知らなくてもHTML(と言えるか微妙だが)分かれば使えるってのもあるかもね。
サイト全部がPHPじゃないし、みんながみんなPHP使えるわけじゃないからな。
PHP使うなら PHP の include しても file_get_contents しても、適用できるなら得られる結果は一緒でしょ。
2018/07/10(火) 18:15:06.82ID:lHg/M16h0
>>261
使う理由は特にない

1.SSI/#include file|virtual="path"はpathの中身をそのまま取り込んだ結果を取り込んだ場所で出力する
2.<iframe src="url|local_path">は対象の出力をフレームとして取り込む
3.file_get_contents('url')はurlの出力を取り込む
4.file_get_contents('local_path')はlocal_pathの中身をそのまま取り込む
5.includeは対象を「PHPのコードとして評価する」

1 ≒ 2 ≒ 3 ≠ 4 ≠ 5
だと思っとけばいい
includeとfile_get_contents()が等価なんてのは大嘘なので信じないよう

SSIの#includeに該当する処理は、そのほとんどが<iframe>+αで片付く程度の低レベルの事しかしてないね
繰り返すけど今更使う必要性は全くない過去の遺物です
2018/07/10(火) 18:40:58.20ID:b+YyloMOd
>>263
詳しくありがとう
2018/07/10(火) 18:46:59.92ID:MaGnmy4dM
include と file_get_contents が等価だなんて言ってないぞ。
別のコンテンツを差し込む方法として適用できるケースがあると言ってるだけで。
例えばページのヘッダやらフッタやらを別ファイルに浮かせたとして、それが include できるなら include で、file_get_contents できるなら file_get_contents で差し込めるだろ。
2018/07/10(火) 18:59:01.25ID:Whumi4Kc0
>>265
> PHP使うなら PHP の include しても file_get_contents しても、適用できるなら得られる結果は一緒
一緒じゃないでしょって話だと思う
実際全然違うし
2018/07/10(火) 19:08:22.00ID:MaGnmy4dM
>>266
例えばただのHTMLファイルがあったとして、それを include した場合と file_get_contents 使って出力した場合とで得られる出力結果にどんな違いがあるの?
もちろんただのHTMLじゃないものを扱おうとすれば、得たい出力を得るために適用できないこともあるよ。
>>263 の PHPのコードとして評価するというのも語弊があると思うよ。
パースはテキストとして始まるわけだから。
2018/07/10(火) 19:24:15.15ID:lHg/M16h0
初心者も見てるだろうから実例を出しとく

・test.php
------------
test
<?php
echo $a;
------------
2018/07/10(火) 19:25:00.51ID:lHg/M16h0
・index.php
------------
<?php
$a = 'hoge';

var_dump(file_get_contents('./test.php'));
/*
test
<?php
echo $a;
*/

var_dump(file_get_contents('http://localhost/test.php'));
/*
test
Notice: Undefined variable: a in...($aが定義されていないというエラー)
*/

include './test.php';
/*
test
hoge
*/
------------

この違いを理解してるならこれ以上俺から言う事は何もない
270デフォルトの名無しさん (ワッチョイ 2ad0-kMcx)
垢版 |
2018/07/15(日) 17:40:24.73ID:0ke1s5C30
PHPを勉強している者ですが、
PHPを使ってお問い合わせフォームを作る際に気を付けるべきセキュリティ対策についてのアドバイスをください。

メールの送信までの流れは「入力」→「確認」→「送信」となりました。

入力・・・入力される文字の制限(メールアドレスの欄なら使用可能な文字以外でエラー)
確認・・・出力の前にhtmlspicialchars()を使い無害化
送信・・・?

参考になるサイトや書籍のアドバイスなどもいただけると嬉しいです。
よろしくお願いします。
2018/07/16(月) 06:50:46.92ID:S86tTn750
>>270
とりあえず思い当たることをざっくり。
・SQLインジェクション対策
・セッションハイジャック対策
・HTTPSの確認
・管理者のうっかり対策
・スパムメール基地化の防止

前2つはこの言葉と PHP で検索すれば出てくると思うけど、SQLインジェクション対策にはPDOのプリペアドステートメントとバインドを使うとか、セッションハイジャック対策は個人的には問い合わせフォーム程度ならセッションなんて使わずhiddenでたらい回しにするかな。
HTTPSの確認は、HTTPでアクセスされた場合に受け付けないとかHTTPSにリダイレクトするとかの施策だけど、シンプルなサーバ構成なら $_SERVER['HTTPS'] が 'on' かどうかを見ればいいものの、webサーバの前段に何か(AWS の ELBとか)入れてるとそれじゃダメなこともある。
開発前に HTTP と HTTPS でのアクセス時の違いを phpinfo を diff 取って確認しておくのがいいんじゃないかな。
管理者のうっかり対策ってのは、問い合わせ内容に悪意あるURLなんかが書かれていてもうっかり踏まないようにするとか。
悪意あるURLじゃなくても、管理画面なんかからリンクを直接踏めると referer とかで管理画面のURLが漏れることがある。
スパムメール基地ってのは、もし受け付け時にユーザーにメールを送信する場合、他人のメールアドレスを入力されるとそっちへメールが飛ぶことを悪用されること。
文面に悪意あるURLを書かれると、それを踏まされちゃうかもしれない。
対策はいろいろあると思うけど完璧な対策は難しく、どこかを妥協することになると思う(メール送るのやめるとか)。
272270 (ワッチョイ 2ad0-kMcx)
垢版 |
2018/07/16(月) 14:33:10.45ID:HXh/vnsc0
>>270です。

>>271さん
詳細なレスをくださり、ありがとうございます。
今回いただいたアドバイスを元にセキュリティを強化していきます。
本当にありがとうございました。
2018/07/16(月) 15:47:41.60ID:+45YTdov0
>>272
こんなところで聞くだけじゃなく、本買ってちゃんと勉強した方がいいよ
得丸さんって有名な人が最近本出したから買って損はない
274270 (ワッチョイ 2ad0-kMcx)
垢版 |
2018/07/16(月) 15:53:45.47ID:HXh/vnsc0
>>270です。

>>273さん
書籍情報ありがとうございます。
独学なのでありがたいです。
2018/07/16(月) 16:20:11.41ID:+45YTdov0
>>274
ごめん、名前間違えてた

徳丸 浩
体系的に学ぶ 安全なWebアプリケーションの作り方 第2版 脆弱性が生まれる原理と対策の実践

PHPがサンプルで使われてるので参考になると思うよ
276270 (ワッチョイ 2ad0-kMcx)
垢版 |
2018/07/16(月) 19:00:14.50ID:HXh/vnsc0
>>270です。

>>275さん
徳丸 浩ですね 了解しました。
重ね重ねありがとうございました。
277デフォルトの名無しさん (ワッチョイ ead2-1dqK)
垢版 |
2018/07/16(月) 21:18:00.33ID:UPJrQacm0
書きっぷりから本人の気がするな
2018/07/16(月) 21:23:20.97ID:ui8Qw0tX0
練習なら色々気を遣うトレーニングになるからいいけど, 実際に公開する場合にはよく使われてるメールライブラリを使うべきだろうな
2018/07/16(月) 21:31:31.14ID:KfOaKyfW0
>>278
スパムメール基地化に対しての対策とってるライブラリなんて見たこと無い。
正直、自動返信は鬼門だと思う
2018/07/16(月) 22:09:49.12ID:S86tTn750
>>279
それはライブラリでどうこうできる問題じゃなさそうだよね。
個別にトレードオフ見て仕様化してる。
送信されることを緩和するならボットチェック(と言うのか知らんが)入れるとか、本文の悪用防止ならメールに入力本文は転記しないとか入力本文中のURLを伏せて転記するとか、
あるいはそもそもメール送らないとか、悪用元が分かってるならIPアドレスチェックして内部処理変えるとか。
本文転記のニーズは高いから難しいのよね。
2018/07/17(火) 15:39:21.70ID:7HO9UDJa0
自動投稿系のスパムはハニーポットしかけるのが楽

<input type="text" name="mail" value="">
みたいなよくあるname値をもたせたダミーの<input>タグをcssとかで非表示にして
GETやPOSTメソッドでnameの値が飛んできたらスパム扱いにするだけ

初心者でも簡単に実装できるのがメリット
2018/07/24(火) 16:30:53.54ID:noMJmsz30
クラスAを継承したクラスA1、クラスA2を作りました
クラスA1ではB1、クラスA2ではB2クラスをuse Bx as Bとして読み込み
クラスAにクラスBを操作する処理を書けばクラスA1、A2に共通の処理を書かなくて済むかと思ったのですが、名前空間的にnew BとするとクラスAを基準としたパスで読み込もうとしてnot foundになってしまいます
親クラス側から子クラスで読み込む前提のクラスに対しての操作を書く方法はありますでしょうか?
2018/07/24(火) 21:31:33.69ID:hRNBzg1Ya
>>282
コード無いからエスパーするとinterface使え
2018/07/25(水) 23:37:30.51ID:DQL2gxnr0
エスパーすると設計がおかしい
285デフォルトの名無しさん (ワッチョイ f2ab-53i4)
垢版 |
2018/07/26(木) 12:53:46.16ID:kn/Cla8U0
少しマニアックな可能性はありますが
シーサーブログへの自作エディタを作成したいと思っています。
プルダウン方式で時刻を簡単に選んだり
その他を大分楽にすすめる事ができるのが目的です。

PHPでライブドアへの投稿ツールを少し作成してみたり
PHP、pythonあたりを少しだけ知っている、というのが
現状の自分かと分析していますが

ネットで少し検索してもシーサーブログへの投稿のためのプログラムは
PHPであまり引っかかりませんでした。
最終的には、タイトル変更、カテゴリ選択、時刻設定、定型文の挿入あたりの出来る
ツールを目指しているのですが、

スレッドのPHPとは離れますが
もし良いツールが出来るならPerl、Rubyなどもチャレンジしてみるしかないのか、
と思うのですが、

現状、攻めれそうな言語、もしくは方法を・・
本当にすみませんが、大まかなアドバイスでもいただけたら有難いです・・
よろしくお願いします。
2018/07/26(木) 14:21:12.96ID:YpwlC3d50
>>285
結局APIをAPIの仕様に沿って叩くだけなんだから
言語なんか別に何でもいい

SeesaaのAPIはXML-RPC互換らしいが
XML-RPCを採用しているPHP製CMSで有名なのはWordPress
だから情報は豊富にあるかと
287デフォルトの名無しさん (ワッチョイ f2ab-53i4)
垢版 |
2018/07/26(木) 14:36:09.87ID:kn/Cla8U0
>>286
有難うございます。なるほど、そういう事ですか…。

確かにWordPressのそういう解説はある程度あると思われますし、
まずそこを自分も作って、それをシーサー向きにカスタマイズ、
という方向にもっていってみるのが得策ですかね。
プログラム等々色々しっかり理解できていないので
例えば、テストのワードプレスに投稿がうまくいっても
それをシーサーに対応させる、その箇所でいかにも自分はつまずきそうですが…
やってみようと思います!ありがとうございました!
2018/07/26(木) 19:50:32.44ID:3rgn08oe0
formからfileタイプでファイルを送信するとき、一緒にカスタムデータも渡したいんですが
phpでカスタムデータを取得するにはどうすればいいんでしょうか
2018/07/26(木) 20:08:56.19ID:scJUypQr0
カスタムデータってなに
2018/07/26(木) 23:45:01.90ID:IPVWqDZwM
ほんと質問の意味が全く分からんなw
2018/07/27(金) 01:47:39.64ID:Cv6I99asa
カスタムデータはバックエンドやのうてフロントエンドで使うもんや
2018/07/27(金) 04:29:13.10ID:2LlMOc7f0
javascript じゃないの?
MDNとにらめっこするよろしー

https://developer.mozilla.org/ja/docs/Web/API/File/Using_files_from_web_applications
2018/07/28(土) 03:40:13.45ID:zAnhzC560
html5の属性にdata-がつくってやつ?
submitを動作のない通常のbuttonにしてjsでsubmitするようにして
submitの前にjsでdata-要素を探して中身を
hiddenフィールドに追加する処理書けば渡せる
onsubmit時にやってもいいけどjavascriptオフだと想定したデータを受け取れない
buttonにしてjsでsubmitすればjavascriptオフだとsubmit自体ができなくなるが
そっちのほうが開発者には都合がいい
2018/07/28(土) 19:53:18.72ID:lnl3z2ED0
スレチ
2018/07/28(土) 21:32:05.50ID:zAnhzC560
スレチちゃうやろー
2018/07/28(土) 21:36:21.75ID:aLrZyGnX0
質問内容がPHPに関してではないし
回答もjavascriptを使用してと言うことだし
Web製作板なら全般に渡って質疑しても良いけど
プログラム板に設置したPHPスレとしては
ちょっと違う感じを否めない
2018/07/28(土) 22:21:44.16ID:zAnhzC560
webprogのほうは手取り足取りしてほしけりゃこっちこいって
初心者こっちに丸投げしてんだよな
だから多少ズレててもしょうがない
2018/07/28(土) 22:36:05.72ID:aLrZyGnX0
難民受け入れる?
嫌がる人がいないなら、自分は反対はしない
2018/07/29(日) 00:42:21.80ID:5d6XvWgua
開発者都合を優先する愚か者がいると聞きまして
2018/07/29(日) 09:07:26.00ID:6Xs8CgHh0
今どきレガシーIE使ってるのとJavaScript使えない環境なんて考慮する必要ある?
そういう人たちの考えを改めさせるためにも甘やかしてはだめだ
あと広告ブロッカーなど入れてる人間にはおかえりいただくのだ
301デフォルトの名無しさん (ワッチョイ 1222-Hl5m)
垢版 |
2018/07/31(火) 22:09:39.35ID:jEXf5efo0
IE11は新機能も追加されないのに
2025年10月までサポート続く
頭の固い奴がいつまでも使い続けそう
2018/08/01(水) 00:53:10.63ID:BvwC4qZXa
そのレベルまで言うならサーバサイド使う必要性あるか?
2018/08/01(水) 07:58:48.60ID:Vw19BKKS0
>>301
現状まだIE11はいいんだけど
このまま取り残されるつもりなら害悪だね
ITリテラシーのないユーザーが悪いわけではないが

>>302
サーバサイドとクライアントサイドでは出来ることが違う
質問者のフォーム設計がクソであろうことは疑いの余地はないが

>>300で言いたかったことは
閲覧者様ありがとう!1人でも多くの閲覧者様に奴隷のように対応します
ではなくサイト開設者側が閲覧者を選んでもいいということだ
2018/08/01(水) 14:08:02.83ID:/ct8Nmlma
JS書けないオジサンだな
2018/08/01(水) 17:38:42.26ID:bHIdHVss0
うむ
2018/08/01(水) 17:48:51.49ID:a1G0tkY30
オジサンだとPHPも難しいと思う
2018/08/01(水) 18:05:25.96ID:zQceqn770
cakePHP3を使ってます。
mysqlに保存する場合、メールアドレスも暗号化した上で保存したほうがいいの?
2018/08/01(水) 18:07:30.41ID:bHIdHVss0
CakePHPの名前を出す意味が分からんが
動かす環境や設計思想によるとしか
2018/08/01(水) 21:49:19.72ID:leTOpWGGa
curl_setoptをphp.iniの中で設定したいのですが、そんなこと出来ますか?
2018/08/01(水) 23:56:12.68ID:leTOpWGGa
curl_setopt($ch, CURLOPT_SSL_CIPHER_LIST, 'ecdhe_ecdsa_aes_256_sha');
と同じ設定をiniファイルで設定できるかと
curl.ssl_cipher_list="ecdhe_ecdsa_aes_256_sha"
とcurl.iniに書いてみましたが、うまくいきませんでした
iniファイルで設定するのはやはり無理なのでしょうか?
2018/08/02(木) 00:00:30.23ID:YVITecbMa
curl使うタイミングで関数使ってやってください
2018/08/02(木) 00:10:24.86ID:ZUaPNP+za
そうですか
VPSで動かしているTinyTinyRSSで、HTTPSのスクレイピング時にエラーが出ていて
CURLOPT_SSL_CIPHER_LISTを設定すればいいということまでは分かったのですが
コードを書き換えたとしてもアップデートで上書きされてしまう可能性があるので
設定ファイルでデフォルト値を設定できないかと思ったのですが、残念です・・
ありがとうございました
2018/08/02(木) 00:37:20.93ID:xZR22mJ60
>>310
自前のiniファイルを適当に用意し、parse_ini_file関数で読み込む
314デフォルトの名無しさん (アウアウウー Saa7-lVen)
垢版 |
2018/08/02(木) 02:01:14.88ID:ZUaPNP+za
それだとcurl呼び出し部分のコードを結局書き換えないとですよね?
設定ファイルで設定したいと言ったのは
コードに手を加えずに挙動を変えたいという意味でした
目的じゃなくて手段です
2018/08/02(木) 11:54:14.81ID:G7lRGrKt0
>>314
infoで出てくるcURLライブラリの情報出して
cURLのビルド設定によっては楕円曲線をデフォルトで無効にしているケースがある(あった?)
2018/08/02(木) 11:56:18.56ID:G7lRGrKt0
infoじゃねぇや curl -v だわ
2018/08/02(木) 12:20:37.41ID:VtR7nk5s0
>>314
そこまで説明しなくても普通は>>310読みゃ分かるよw

そういう時は普通はラッパークラスを作る
Adapterパターンとかでググるといい
318デフォルトの名無しさん (ワッチョイ f39d-Eno9)
垢版 |
2018/08/02(木) 14:47:11.29ID:mV4uuTxi0
curl直接使うよりguzzle通じて使った方が良いよね?
よっぽどシンプルなプログラムとかでも無い限り

AWS SDK for PHPでも内部で使ってた
2018/08/02(木) 15:22:19.78ID:VtR7nk5s0
手続き型の書き方しかできないcURL関数群をラッピングして
オブジェクト指向型のインターフェースを提供するライブラリは色々とあるから
実用的にはそっち使った方がいい(もちろん今ならguzzleが第一選択肢)

車輪の再発明をする必要はないが
guzzleみたいにガッツリじゃなくて
cURLのうすーいラッパークラスを作っとくと
ちゃちゃっと何かしたい時に便利ではある
2018/08/02(木) 15:39:52.12ID:G7lRGrKt0
>>312を読んでないのか読んでて無視してるのか

TinyTinyRSSを使うこと自体アレじゃねってのはあるけども
2018/08/02(木) 15:46:53.52ID:qudvT6qVd
TinyTinyRSSの中でguzzleを使った方がいいよねなんて話は誰もしてないかと
2018/08/02(木) 16:04:41.08ID:j3ZbymyT0
ちょうどスクレイピングとかを勉強してる俺にはなんとタイムリーな話題

>>319
> cURLのうすーいラッパークラスを作っとくと
> ちゃちゃっと何かしたい時に便利ではある

もう少しkwsk
2018/08/02(木) 16:20:05.83ID:VtR7nk5s0
>>322
例えば、http://example.com/の出力結果を取りたいってだけなら
file_get_contents('http://example.com/');
だけでいいけど、もう少しだけ色々としたい時

例えば、POSTメソッドで「hage=fuge」を投げつつ
ユーザーエージェント「Mona」、リファラ「http://2ch.net/」にした時の
http://example.com/のステータスコードを取りたいなんて時

$status = Curl_Wrapper::getInstance()
           ->requestPost('hage', 'fuge')
           ->setUserAgent('Mona')
           ->setReferer('http://2ch.net/')
           ->getStatusCode('http://example.com/');

こんな風に書けるクラスを用意しとくと気持ちいいってだけの話
大した話じゃないから意味不明ならスルーでw

>>321
うん
2018/08/02(木) 16:38:35.04ID:j3ZbymyT0
>>323
なるほど
やりたい事を書いた文章がそのままPHPのソースになってる感じですごく分かりやすい

->setUserAgent('Mona')
->setReferer('http://2ch.net/')
こういう書き方ははじめて見た
;のつけ忘れではないよね?
2018/08/02(木) 16:40:40.32ID:G7lRGrKt0
>>324
メソッドチェーン
setうんたら系のメソッドで$thisを返すようにすればよい

ただ(薄いwrapperだからアレだけど)getうんたら系のメソッドで副作用があるのはキモい
2018/08/02(木) 16:52:37.54ID:VtR7nk5s0
>>324
$curl = new Curl_Wrapper;
$curl->setUserAgent();
$curl->setReferer();
$status = $curl->getStatusCode();

普通はこう書くけど面倒くさいから
Curl_Wrapperクラス内のメソッド(setUserAgentやsetReferer)で
Curl_Wrapper自身のインスタンス(PHPなら$this)をreturnする
そのメソッドを鎖のように繋ぐから「メソッドチェーン」って呼ばれる
「PHP メソッドチェーン」とかでググってみるといい

上手く使えばすっきり書けるけどデメリットもあるのでケース・バイ・ケースで
2018/08/02(木) 17:07:33.04ID:j3ZbymyT0
>>325
>>326
詳しくありがとう
メソッドチェーンって呼び方がかっこいいな
すごい勉強になった
328デフォルトの名無しさん (ワッチョイ cf8a-9e/1)
垢版 |
2018/08/05(日) 11:19:39.90ID:EoLQ53rz0
質問です

/aaa.php
/bbb.php
/ccc.php
/ddd.php
... ばらばらに作って使うのと

/xxx.php?aaa
/xxx.php?bbb
/xxx.php?ccc
/xxx.php?ddd
... 一枚にまとめて使うのと
どっちがパフォーマンスいいでしょうか?
よろしくお願いします
2018/08/05(日) 11:27:52.65ID:ekimy5CU0
まとめても数百行程度なら、性能上は変わらないと思うが
メンテナンスする上では、機能別に分けて置く方が楽かも
2018/08/05(日) 11:31:24.74ID:gTgyUF8y0
実体は別ファイルにしてエントリポイントからrouterで振り分ける
2018/08/05(日) 13:40:30.63ID:Klpi4erd0
バラした方が各スクリプトのサイズが小さいなら、物理的な読み取りとパースの分速くはなるんじゃね。
でもそんな細かいことよりメンテ性のいい方を選んだ方がいいんじゃないかな。
2018/08/06(月) 10:30:49.64ID:933yDlcJ0
>>328
よく100万回ループ回した時の実行速度の差を比較したりする人がいるけど
ハッキリいってやるだけ時間の無駄
そんな事を気にするならそもそもPHPなんか使わない方がいい

webアプリのボトルネックというのは
大抵はDB周りだったりするわけで
そのボトルネックを正確に計測し解決する手段を身につける事が遥かに大事

というかそんな事を気にしてるって時点で
何かしらのフレームワークは使ってないんだろうけど
なぜ使わないの?
333デフォルトの名無しさん (ワッチョイ cf8a-9e/1)
垢版 |
2018/08/06(月) 11:23:57.83ID:zcUvwpke0
>>332
フレームワークとか最近知ったばかりでよくわからん初心者です
DBじゃなくてテキストファイルで処理するphpをああだこうだ弄って遊んでいて
ふと思い付きで質問してみました
2018/08/06(月) 12:20:51.12ID:ng9YxNhi0
PHPに関してフレームワーク使って良かったと思える場面て正直ほとんど無いな。
PHP自体がごった煮状態にしてまでいろいろできるようにしてある中で、フレームワークで実現しようとしている目標がいまいちわからん。
生産性にも得してるように思えないどころか、フレームワーク自体のメンテがだるい。
まあそれほどフレームワーク使ったわけでもなく、古くはSmarty、ちょっと前はCakePHP使ったくらいで、それも他所のベンダが作ったのを引き継いだくらいだから偏見に満ちてる可能性はある。
2018/08/06(月) 12:22:54.58ID:933yDlcJ0
>>333
そか
フレームワークに頼らずに作るのも
DBに頼らずテキストベースで読み書きするのも
とても良い経験にはなるから頑張って

ただ○万回ループした時の実行時間の差を気にするなんてのは
本当にただの無駄でしかないから
コードの見通しの良さとか管理のしやすさとか
そっちを最優先で

root.php?mode=aaa ⇒ mode/aaa.phpを読む
root.php?mode=bbb ⇒ mode/bbb.phpを読む
root.php?mode=ccc ⇒ mode/ccc.phpを読む

なんて作り方もある
今これがベストだと思って設計しても
どうせ1年後にはもっと良い設計が閃くさ
だから色々と試してみるといい
2018/08/06(月) 12:33:44.81ID:933yDlcJ0
>>334
大規模開発をした経験がないとそうなるかもね

PHPはとてもいい加減な言語なんで
”正しく”書くにはかなりの知識と経験が必要
ネット上のPHPコードの多くが糞なのを見てもよく分かる

だから特定の規則さえ覚えれば”正しく”書ける
フレームワークってのは大規模開発では必須になる

あとは生産性の問題やね
スクリプト言語なんてものはいかに短時間で簡単にものを生産するかが鍵なので
個人開発であっても何かしらのフレームワークは使え
ってのが俺の意見

俺々マイクロフレームワークでもいいからさ
2018/08/06(月) 12:38:09.33ID:Xt7Beabr0
フレームワークの選択を誤ると、
数年後「まだそんなの使っているのか!」
ってエラーが頻発して苦労する
2018/08/06(月) 12:48:26.08ID:UALza30Cd
ネット上のソースのカオスさはPHPとJavaScriptが抜きん出てるよな
本ですら平気で間違った事を書いてるから
初心者ならこれを読めって本がなかなかない

if ($_POST['foo'] == 'var')
こんなコードを見ると目眩がする

>>337
それはあるな
ただ今はLaravel使っとけば間違いはないんじゃないかと
2018/08/06(月) 12:48:56.87ID:ng9YxNhi0
>>336
フレームワークを使うにしても、それをどう使うかは結局設計して周知しないといけないわけで、その手間ってフレームワーク使わない場合とそう変わらなくない?
むしろフレームワークが足かせになってそこから外れる部分をトリッキーに遠回りに書くことになったりのデメリットの方が目についてくる感じだ。
工数削減は俺々ライブラリでやれるし、それを周知する手間も前述の周知に比べて多大なわけでもなく、必要ならライブラリを好き勝手に育てられるから、むしろ身軽で早いと思うがな。
この辺はとりわけ既にいろいろお膳立てされてるPHPならではというか。
大規模開発だとどんなメリットが効いてくると考えてるかについては興味あるけどね。
2018/08/06(月) 13:00:50.54ID:933yDlcJ0
>>338
フレームワークを使わずに
リクエストパラメータを変数に入れて比較してみましょう
って超初歩的な事でも

$foo = (string) filter_input(INPUT_POST, 'foo');
if ($foo === 'var') {}
と正しく書けてる本が何冊あることやら…

$foo = (isset($_POST['foo'])) ? $_POST['foo'] : NULL;
と書けてたらまだマシで酷いのになると

$foo = $_POST['foo'];
だからPHPはヤバすぎる…
2018/08/06(月) 13:13:28.36ID:Xt7Beabr0
PHPがヤバいのではなく、使う奴がいい加減なだけだろう
きちんと書ける奴は、何使っても大丈夫
2018/08/06(月) 13:19:55.19ID:UALza30Cd
フレームワークの重要性が理解できない内は3流以下と自覚すべき
php以外の言語を書けない人に多い
2018/08/06(月) 13:21:13.75ID:ng9YxNhi0
>>340
強制的に string でキャストして情報落とすのが正しいと言われてもなって感じだし、
$foo = $_POST['foo']; がダメというのもそんなの条件次第だろって気もするし、
大事なのは画一的な書き方じゃなくてやり方を適切に選べることなんじゃないの?
2018/08/06(月) 13:28:14.07ID:Xt7Beabr0
オレはこんな感じで書いてるな

$foo = "";
 if (array_key_exists('foo', $_POST)){
$foo = $_POST['foo'];
}
2018/08/06(月) 13:33:40.11ID:ng9YxNhi0
>>344
そのケースなら isset 使ってる。
100万回ループのパフォーマンスなんて気にするなという話の後で言うのもアレだけど、isset の方が速いし短いから。
多重配列の時もそのまま書けるし。
2018/08/06(月) 13:37:32.22ID:933yDlcJ0
>>343
リクエストパラメータを(string)キャストしてるのは
PHPの仕様的に$_POST['foo']が配列になる事があるからだよ

だから>>344だけでは駄目で
少なくともis_string()を追加する必要がある

大垣さんとかPHP界隈のセキュリティで有名な人は言及してるけど
ここら辺まともに書けてる本を俺は見た記憶がない

で、フレームワークってのはこういうところもきちんとチェックしてる
だからフレームワークを使った方がいいよという話

>>341の言う通り使う側の問題なんだけど
知らなくても動いているように見えてしまうというのは罪な事だね
2018/08/06(月) 13:50:50.84ID:UALza30Cd
>>346も書いてるが
?foo[]=1&foo[][]=2&foo[][][]=3
の時の$_GETの中身を見れば$fooがスカラー型になると決めつけていたらだめだと分かるはず
頭の良い人がせっかくフレームワークってのを作ってくれてるんだから我々凡人はそっち使えばいい
だからPHPerって馬鹿にされんだよw
2018/08/06(月) 14:07:27.66ID:933yDlcJ0
>>347
応用パターンとしては

<input type="checkbox" name="foo[]" value="1">
<input type="checkbox" name="foo[]" value="2">
<input type="checkbox" name="foo[]" value="3">

というフォームがあった時に
$_GET['foo']が一次元配列になると決めつけてしまってるケース
$_GET['foo']がスカラー型にも二次元にも三次元にもなる可能性を考慮してないから
バリデーションなんかでエラーをだす残念コードがネット上にはたくさん転がってる

そういうのを初心者が真似してしまうのが問題なんだよね
2018/08/06(月) 14:19:09.94ID:Hk1kxuZq0
filter_inputというものをはじめて知った(´・ω・`)
issetでチェックしなさいというのは最近覚えたけどこっちの方が短く書けるね
勉強になるなあ
2018/08/06(月) 14:21:43.09ID:ng9YxNhi0
>>346
最後については同意。

ただ細かい話、キャストの件は filter_input のオプション無しなら配列は取得されないんじゃないかと。
元々値があったのかどうかの判定が出来なくなるのもまた問題じゃないかね。
だからフレームワークにやってもらえばいいじゃんという立場だとは思うけどさ。

>>347
その程度のバリデーションライブラリも書けない凡人のために(ありものの)フレームワークがあるということであれば、やはりあまり縁の無い話かなと思えてくる。
隣のコンビニになら歩いて行けばいいのに、なぜ車を用意してナビまでセットする?みたいな。
フレームワークってのは、端的に言えば誰が書いても同じ書き方になる仕組みで細かいこと周知しなくてもそうなるから多人数で書いても認識が共有できる、という思想なのかと思ってたよ。
思想通りに実現されるならよさそうだが、現実はそうでもないなって感じてるけど。
PHPみたいにWebに特化してない他の言語なんかは、イチからやるよりはフレームワーク使うのが現実的だと思うし、
PHPでも俺々マイクロフレームワークの話であればその実態は必要ライブラリと雛型くらいのものだろうから、そういうのに異論は無いけどね。
2018/08/06(月) 14:46:52.11ID:933yDlcJ0
>>349
Filter関数は意外と浸透してないっぽい

$foo = filter_input(INPUT_POST, 'foo');

$foo = (isset($_POST['foo']) && is_string($_POST['foo'])) ? $_POST['foo'] : false;
と書くのとほぼ同じ意味になる

上の方が楽だよね
2018/08/06(月) 15:06:29.57ID:Hk1kxuZq0
>>351
下の?を使う書き方が苦手なんよね
頭がわるいからこう書かないと理解できない(´・ω・`)
if(isset($_POST['foo'])){
$foo = $_POST['foo'];
}else{
$foo = false;
}
2018/08/06(月) 15:40:31.71ID:933yDlcJ0
>>352
PHP7からはもっと短く
$foo = $_POST['foo'] ?? false;
と書けたりもする

三項演算子は別に無理して使わなくていいけど
他の言語を経験してると$fooを初期化せずに

if (isset($_POST['foo'])) {
  $foo = $_POST['foo'];
} else {
  $foo = false;
}

と$fooをif〜elseの中に入れてしまうのはとても気持ち悪い
三項演算子を使わないなら自分はこう書くかな

$foo = false;
if (isset($_POST['foo'])) {
  $foo = $_POST['foo'];
}

細かい話なのであまり気にしないくてOK
2018/08/06(月) 15:58:25.55ID:Hk1kxuZq0
ifとelseの中に書くのはあまりよくないのか(´・ω・`)
全部こうやって書いてた。。。
理由が理解できないあほですまんけど次からはfilter_inputを使うから許して
2018/08/06(月) 16:05:18.97ID:UALza30Cd
if (条件A) {
$foo = 'a';
} elseif (条件B) {
$foo = 'b';
}
var_dump($foo);

条件AもBも満たさなかった時にエラーになるわな
まずはvar_dumpが参照できるレベルで$fooを定義して必ず参照できることを保証しろってこと
phpしか書けないPHPerだとelseを書けばいいだろと思うかもしれんがそうじゃないそうじゃないんだ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況