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の改造 >>85
ありがとうございます
requireしたのとかはまだ実験してないけど
とりあえず単純なものなら動きそうですね Swooleとmysqliの非同期APIを使えば
PHPでも最速目指せる? Googleドライブにアップした動画をHTML5のvideoタグを使って自サイトに貼り付け
再生させたいと思っています。以下の様にリンクを作成すれば動画を無劣化で
貼り付けることができるのは分かっています。
<video controls>
<source src="https://drive.google.com/uc?export=download&id={Google動画のID}" type="video/webm">
</video>
ただこの方法が通用するのは動画の容量が数十MBまで。
それ以上の容量の動画は上記の方法では埋め込み再生できません。
完全には把握できてはいませんがGoogleは巨大ファイルのダウンロードに際して
ワンクッションページを挟む仕様のようです。
たとえば800MB超のファイルをダウンロードしようとすると、
https://drive.google.com/uc?export=download&id=1wyXHX_xDh4EntuIG7y6jpHiPZT99OBn26A
上記のようなページに誘導され、そのページ中のダウンロードボタン;
https://drive.google.com/uc?export=download&confirm=-8rW&id=1wyXHX_xDh4EntuIG7y6jpHiPZT99OBn26A
をクリックすると動画のダウンロードが始まります。
ダウンロードボタンのリンクには新たに"confirm=-8rW"というキーワードが追加され、
末尾の4文字"-8rW"はダウンロードページをリロードするごとに変更されます。
またダウンロードボタンのリンクをコピーして違うブラウザを開いてURLを入力して
みましたがダウンロードは始まらず、例のワンクッションページに誘導され新たな
"confirm=****"キーワードが生成されたことを考えるとcookieも使ってるような気がします。
そこでPHPの力を使ってGoogleドライブにアップした巨大動画ファイル埋め込み再生に
チャレンジしてみました。 // ワンクッションページのURL
$cookie='https://drive.google.com/uc?export=download&id=1wyXHX_xDh4EntuIG7y6jpHiPZT99OBn26A';
//クッキー取得のためのアクセス
$ch=curl_init();//初期化
curl_setopt($ch,CURLOPT_URL,$cookie);//cookieを取りに行く
curl_setopt($ch,CURLOPT_HEADER,FALSE);//httpヘッダ情報は表示しない
curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);//データをそのまま出力
curl_setopt($ch,CURLOPT_COOKIEJAR,'cookie.txt');//$cookieから取得した情報を保存するファイル名
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,TRUE);//Locationヘッダの内容をたどっていく
$html = curl_exec($ch);
curl_close($ch);//いったん終了
// confirm=**** のうち末尾4文字を$match["name"]に抽出
preg_match('/.*confirm\=(?P<name>\w+)\&.*/', $html, $match);
// 得られた"confirm=****"を使いダウンロードリンクを生成
$url='https://drive.google.com/uc?export=download&confirm=' . $match["name"] . '&id=1wyXHX_xDh4EntuIG7y6jpHiPZT99OBn26A';
// HTML5のvideoタグを生成して動画の埋め込み再生
echo '<html><body><video controls><source src="';
echo $url;
echo '" type="video/webm"/></video></body></html>';
'cookie.txt'にcookie情報が取得できたのは確認できたのですが
残念ながらこの方法では動画の再生にはいたりませんでした。
方針が間違ってたのでしょうか? 斜め読みしかしてないけど、閲覧側が google ドメインに対して cookie のセットができないんで、その方向性に解はないと思うよ。 >>90
> 閲覧側が google ドメインに対して cookie のセットができないんで、その方向性に解はないと思うよ。
閲覧側の問題ですか・・
PHP使ってGoogleから発行されたcookieを閲覧側に横流しすることって出来ますか?
>>91
一応Googleドライブで動画の埋め込みコードを発行してたりするので(iframeを使ったコードですが)
メディア配信を意識してないわけでは無いようです >>92
そのGoogleドライブが発行する埋め込みコードじゃダメなのか? >>94
「動画の埋め込み」機能で発行されるコードは再エンコードされた動画だったりします
(たとえ最高の1080pを選んでも)
元動画が60pでうpしたのに埋め込み再生される動画は30pに落とされるとかざらにあります
>>88
の方法はそれを回避して動画をオリジナルの画質で再生する方法なんですが
動画の容量が数十MBのものまでしか使えないのが問題でして・・・
>>93
CORS・・・初めて耳にしました
ちょっと調べてみます PHPの力を使うなら、GoogleドライブからPHPサーバーに動画をキャッシュしてストリーミングしてしまえ
http://demo.codesamplez.com/html5/video >>96
> PHPサーバーに動画をキャッシュしてストリーミングしてしまえ
無料レンタルサーバーなんですよね、
そんなことしたら怒られそうで・・・ 画像特化CDNのCloudinary最近動画配信機能強化してなかった?
無料枠で納まるか知らんが。 よくわからんが1個の動画容量が数MBでも問題ないだろ
メタデータ作ってHLSで繋いで再生すればいいだけで PDOでのデータベース操作が上手くいかないので質問させてください
mysql> SELECT number FROM testtable;
+--------+
| number |
+--------+
| 204 |
| 226 |
| 234 |
| 246 |
+--------+
4 rows in set (0.00 sec)
このようなnumberカラムを持つtesttableで、特定の値(仮に今回は3番目の234とします)より大きいnumberを持つレコードのみ+1するということが目的なのですが、
直接mysqlで以下のstatement:
>UPDATE testtable SET number = number + 1 WHERE number > 234;
を実行すると
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> SELECT number FROM testtable;
+--------+
| number |
+--------+
| 204 |
| 226 |
| 234 |
| 247 |
+--------+
となり、目的が達せられます しかし、これをaxiosでPOST requestしたphpの関数上で行うとおかしな結果になります
======
try {
$connection = new PDO(
'mysql:host=' . $host . ';dbname=' . $dbname,
$username,
$password,
$options
);
$connection->exec(
'update testtable set number = number + 1 where number > 234'
);
echo 'run only once.';
} catch ~~~~
=====
上記がphp内のPDOで同じstatementを実行している部分で、
この実行の後に、numberカラムを確認すると mysql> select number from testtable;
+--------+
| number |
+--------+
| 204 |
| 226 |
| 234 |
| 249 |
+--------+
4 rows in set (0.00 sec)
このようになぜか + 2 されてしまいます
exec内のstatementが意図せず2回実行しているのかと疑って、
$connection->exec(
'update testtable set number = number + 1 where number > 234'
);
の [ number = number + 1 ] を [ number = number + 2 ]
として変更すると + 4 されるので、恐らくその点については疑い通りなのですが、
一方でaxiosのresponseは、'run only once.'と期待通りになっていて
echoの内容が重なっていたりはしないので、このブロック全体が2回実行されているわけでもないようです
結局何がどうなっての結果なのかさっぱり分かっていないという状態です
上記の挙動について、考え得る原因やなにか自分に落ち度があればその点ご指摘いただけますでしょうか
長々と質問してしまい申し訳ありませんが、どうぞよろしくお願いいたします たまにあるのが、ブラウザの拡張機能が悪さしているケース。
何故か、2回アクセスしてたりする。
アクセスログ見てみるといいよ。 POSTが二回発行されてたら、echoじゃわからないんじゃね? formのsubmitとajaxが2つ動いてるパターンIEでよくある。 遅くなってしまいすみません
>>103
まさにこちらがどんピシャリでchromeでは上のような挙動になるのに、Edgeだとちゃんと動きました
ですがchromeの何が悪さをしているかは謎のままなので、これからどのように特定すればいいのか少し調べてみます
ありがとうございました
>>104
axiosのresponseが2件重複しているかは最初に調べて、postの重複でないことは確認しておりました 指定したディレクトリ配下全ての拡張子jpegをjpgに書き換えるコード
function jpeg2jpg($path)
{
$array = glob($path.'/*',GLOB_ONLYDIR);
foreach ($array as $filename)
{
jpeg2jpg($filename);
}
$array = glob($path.'/*.jpeg');
foreach ($array as $filename)
{
$newpath = str_replace(".jpeg", ".jpg", $filename);
rename($filename, $newpath);
}
}
これをもっと綺麗なコードにしたいんですが何かありませんか? >>110
それで十分綺麗だと思うけど。
ファイルの検索とリネームを分けるこんな方法もある。
function files($path)
{
yield from glob($path.'/*.jpeg');
foreach (glob($path.'/*', GLOB_ONLYDIR) as $dir) {
yield from files($dir);
}
}
foreach (files('images/') as $jpeg) {
$jpg = str_replace(".jpeg", ".jpg", $jpeg);
echo "rename($jpeg, $jpg);\n";
} >>111
yieldって構文は知らなかった。ありがとう file_get_contentsで2chの過去ログ保管サイトをスクレイピングしてるんだが、なぜか連続で更新すると内容を取得できないことがある
これってサイト側がスクレイピング対策のブロッキングを施してるってことなのかな? >>114
そうかもしれないし、違うかもしれない
事実はサイトの運営者のみが知る
人間っぽくないリクエストを弾く方法はいくつもある
高負荷のリクエストを送るIPをブロックしたり、
ハニーポット置いたり
Facebookはマウスの動きまで見てるらしいが
そこまでしてる所は稀だろう
1分間のリクエスト数に制限かけたり、
Exponential Backoffで時間置いてからリトライしたら?
https://github.com/bandwidth-throttle/token-bucket
https://github.com/stechstudio/backoff C#かjavaのコードをPHPのコードに変換できる無料ツールってないかな?
↓このSDKをPHPにしたいんだが
https://sevenzip.osdn.jp/sdk.html >>116
変数に$を付けて回るだけでほとんど丸コピーで動くから
perlとかphpといったスクリプト系の無料ツールを使うと良いよ ↓こういうjson配列を
[
{id:0, name:"ああ", age:20,....},
{id:1, name:"いい", age:21,....},
{id:2, name:"うう", age:22,....},
];
idとname以外のデータ落として↓一次元の連想配列に変えたいんだけど
{0:"ああ",1:"いい",2:"うう",};
array_filterで一発変換みたいことは無理? json向けの組み込み関数は少ない
外部ライブラリ使えば可能だと思うが
関数1つにこだわる必要もないだろう array_columnとarray_combineでどうぞ preg_replaceで$1を$foo["$1"]に置き換えたいのですが
$1の意味が違うのでこれではundefined indexになってしまいます
ここはどう書くのが正しいですか? すみません自己解決です
callbackじゃないとだめみたいですね CRで保存したファイルを読み込んで、
一部の\rとか\nとかtrimで除去してたらおかしくなってしまいました。
CR+LF、LFは問題ありません。
コードでどうにかするのはめんどくさそうなので、
CRのファイルだったらLFに内部で変換するようなことってできますか? >>128
簡単にできるよ!
じどうてきにCRをLFに変換する関数を呼ぶ仕組みが用意されてる
入出力ストリームとかストリームラッパーで検索しよう >>128
CRで保存するってどういう事情でそうするの?
個人的に知りたい >>130
アホのマカーが作ったファイルとかでしょ >>129
ありがとうございます。
頂いたヒントからたどり着いた答えは、php://filterですがあってますか?
ビルトインのフィルタを確認しましたが、文字コードを変えるものはありましたが、
改行コードを変えれそうなものはなさそうなので、自分で作って登録しろということでしょうか?
>>130-131
アホかどうかはおいといて、そういうことですねー >>132
str_replace(["\r\n","\r"],"\n",$subject)
でよくね
ストリームとか全然わからん Apacheってオワコン?
速度は静的コンテンツについてはnginxの完全勝利
動的ならApache+fpmでnginx+fpmと同程度
.htaccessでどのディレクトリでも
設定変更出来るのはDockerが一般的になった今や無意味
むしろセキュリティ上のリスクにもなり得る
preforkモジュールにすればsupervisordなしでDockerコンテナを一つに出来ると言うメリットは一応あるが
preforkモジュールはかなり遅い あとApacheの設定ってすごく読みづらくね?
nginxの方が直感的に理解しやすい それを5chの僻地で主張することにどんな意味があるの? どっちもオワコンだろ
lswsを使ったらもう戻れない >>137
そんなもの流行りませんよ
apacheのデファクトぶりに震えて眠れ 「〜はオワコン」って言ってるのは評価軸を決められない未熟なエンジニアか荒らし。
どっちゴミなんでほっとけばいい。 nginxはここ数ヶ月で下落の兆候あり
apacheとiisは長期的に下落を続けている
かといってlswsが急上昇してるわけでもない
さて一体失われたシェアはどこへ行ったのやら >>125
こういう関数がすっと出てくるのはすごいと思う。
mapしてzipしてcollectすればいいと考えても、そこからPHPの関数にたどり着くまでが大変。
覚えりゃいいんだけど、PHP離れるとすぐ忘れるし。 International Semantic Web Research School? >>140
アイじゃなくてエル LiteSpeedWebServer
PHPはこのサーバ向けにカスタマイズされた特殊なものが使われてる
おかげで設定なしにPHPが導入出来るばかりか
優秀なリポのおかげもあって常に最新のPHPにアップデートされる
もちろん普通のPHPのコードが動くので心配はいらない
Web設定ツールはPHPで書かれているのでPHPとセットになってるし
特にWP向けに最適化されててWP配信ならWebServer界最速で
PHPerのためのサーバといっても過言じゃないわ オープンソース版もある
https://openlitespeed.org/
solarisとopen solarisみたいなもんだ openlitespeedって公式dockerないの?
検索しても出ない >>142
貧乏人だからセレロンに8GBのノートPC
これじゃあんま強力な環境を作れず
IDEよりもエディタで本当はフレームワーク勉強したいけど
開発環境作ると重いしピュアなPHPでゴリゴリ書いてる
だから俺はPHPの関数めっちゃ覚えてるよ
あーいいパソコンがほしい メモリ8Gってすげえ高性能だな
俺なんかまだ716MBで頑張ってるよ >>148
同意します。
ブラックボックスは小さい方が良いと思う。 >>150
linuxのコンソールからviでも起動してプログラムかいてんのか?
それだったら尊敬するわw >>152
xp
5chとネットサーフィンだけだけど全然余裕
ブラウザはnewmoonってのを使ってる >5chとネットサーフィンだけだけど全然余裕
PHP書けよ Atomで書いてるけど、最近Visual Studio Codeに浮気しようか悩んでる >>155
元Atom使いだがVSCodeのがいい htmlとcssが出来るようになった
次はjavascriptかphpを勉強したいと思ってる
どちらから先にやるべきだ?
分かりやすく教えろ。 phpはブラウザで使えない
javascriptはサーバーで使うには素人は難しい 次はxmlとxsltだ
異論は認めん
さぁ頑張ってこい $dbh = new PDO(
'mysql:host=localhost;dbname=db1;charset=utf8', $user, $pass
);
っていう、dbへの接続方法
$dbh の中身をどうやって実行するんや!?と思ってたんだけど、
new PDOでPDOが呼ばれた段階でPDO以降の実行結果が代入されるということだから、接続確立したって事でOK?
あほだからこんな事で丸一日悩んでしまったんだけど… JavaScript優先だろう
JavaScriptは今やhtml5を使うには必須スキルで代えは聞かない。
ブラウザあればすぐに試せるから実行環境が用意しやすい。
Googleドライブにあるスプレットシートなどのマクロ、Google Apps ScriptなんかもJavaScriptと同じ構文で動くし
RPGツクールMVなどのゲーム作成でも役に立つ。node.jsのようなサーバーサイドで動くJavaScriptもある。
JavaScript知識は活用範囲は非常に広い
phpは基本サーバーサイドでしか動かんし用途が限定的。
ライバル言語が非常に多く、別の言語でもいいってこともしばしば
他に代用がいくらでもあるので優先順位は低い java script とかはやりたい事ググってサンプルスクリプトを見つけて
コピペしてあまり理解せず使ってるわ
そんなもんでいいだろう <script type="text/php">
$a = Document::getElementById('a');
$a->style(['background-color'=>'#fcf']);
$a->innerHTML('<p>hello</p>');
try {
Core::ajax('http://example.com', 'get', function($text) {
});
} catch (HttpError $e) {
}
こんなん探せばありそう 素のPHPでWebバックエンド周り(フォームとかセッションとかセキュリティとか)を一通りやるのは悪手とは思わん。
その後はさっさとPHPとおさらばして、他の言語に移るべき。 >>167
MariaDB上のデータベースをネットから検索する簡単なフォームとPHPを書こうと思うんだけど、
面倒くさい。
データベースの構造を元に検索フォームとPHPの雛形を簡単に作ってくれるアプリは無いのかな? それこそWebフレームワークが最も得意なことじゃない bitbucketに対してコミット、プッシュが簡単に出来るphpライブラリって無いかな?
無ければssh2_connectコマンドで頑張るしかないんだけど VPSからPHPで外部サーバへFPTS接続して、ファイルをアップロードしたいのですが、
ftp_ssl_connect()は成功してるようなのですが、
ftp_login($connectId, $userId, $userPass) のところで
「SSL/TLS handshake failed」「Proceed with negotiation」などと出て失敗してしまいます。
php.info()では「ftp」「openssl」は有効になっているのですが、
ほかに何か設定するべきところがあるのでしょうか?
送信元のapacheやvsftpdなど。
送信元のサーバのapacheで証明書とかも要りますか?
OSはCentOS6
PHPは5.1.6です。 そんな古いPHPでSFTPとかなんかやばそうw
多分原因もそれでしょ opensslも古そう
VPSなら環境のアップデートぐらいしなさいよ こちらも同じ見解に達していました。
ありがとうございます。
OpenSSLが0.98とかで、今や一般的ではないようです。大は小を兼ねるみたいに向こうが新しくても、互換でやってくれるとかじゃないみたいですね。 セキュリティ系は古いもの切り捨てないと穴あいちゃうからねぇ。 今はプログラムよりツールの使い方を学ぶ時代になって
新人にとってはずいぶんつまらない世の中になってしまったな 昔の人がアセンブラ書かないのはプログラマじゃないって言ってるようなもんだろ
時代は常に流れているんだよ >昔の人がアセンブラ書かないのはプログラマじゃないって言ってるようなもんだろ
つまらなくなったとはいったけどそこまでいっとらんわ
今と比べて面倒なことをしろなんて主張もするつもりはない
スタート地点で面倒なことから始めればそれを面倒とは思わないだろうし
人間後退したくない以上より多くを覚えるならスタート地点は重要だけどね
目的違うしアセンブラから始められてたらもっと楽しかったのだろうとは微塵も思わんけど
出来ることは増えてただろうし習得してればまた考え方も変わるのだろう しっかしーこのスレ死んどるな
もうPHPも終わったんだな 死んではいないしょ
WEBではなんだかんだこれ以外の選択肢は多くないし
てか、5chで情報共有なんかしないわ まぁ、たしかにもっと愚痴がこぼれてきてもイイと思う。
なんで、7.4の阿鼻叫喚がここに流れない??? ■ このスレッドは過去ログ倉庫に格納されています