- 投稿日:2020-11-18T19:39:59+09:00
PHP8 RC、Composer2、Xdebug3 RCでLaravel8.xを動かす
概要
- PHP8.0がRCになっていたから諸々新し目のものを使って環境構築してみるよ
- 環境自体はDockerで構築していくよ
- 全ての環境に対応出来るわけじゃないと思うけど参考になれば嬉しいよ
- PHP8.0もXdebug3もRCなので現状は実運用しないように、とはいえ開発していくのには見ていくことも必要だよね
最終的な環境
$ docker-compose exec app php --version PHP 8.0.0RC4 (cli) (built: Nov 12 2020 20:17:20) ( NTS ) Copyright (c) The PHP Group Zend Engine v4.0.0-dev, Copyright (c) Zend Technologies with Zend OPcache v8.0.0RC4, Copyright (c), by Zend Technologies with Xdebug v3.0.0RC1, Copyright (c) 2002-2020, by Derick Rethans $ docker-compose exec app composer --version Composer version 2.0.7 2020-11-13 17:31:06成果物
GitHubにあげてあるので参考にどうぞ
Dockerfileの最終状態もリポジトリにあげてありますhttps://github.com/hrs-o/PHP8.0RC-Laravel
PHP7.4 時代のDockerfile
- この7.4時代のDockerfileを8.0RC用に書き直していくのが主目的
FROM php:7.4-fpm-alpine RUN apk upgrade --update && \ apk --no-cache add autoconf build-base git libxml2-dev libzip-dev oniguruma-dev openssh rsync RUN docker-php-ext-install -j$(nproc) zip pdo_mysql mysqli RUN docker-php-ext-install -j$(nproc) bcmath fileinfo ctype json mbstring tokenizer xml RUN docker-php-ext-install -j$(nproc) opcache RUN pecl install apcu \ && docker-php-ext-enable apcu RUN pecl install xdebug \ && docker-php-ext-enable xdebug RUN pecl install redis \ && docker-php-ext-enable redis RUN curl -sS https://getcomposer.org/installer | php \ && mv composer.phar /usr/local/bin/composer \ && composer self-update RUN composer global require hirak/prestissimo RUN composer global require squizlabs/php_codesniffer RUN composer global require friendsofphp/php-cs-fixer RUN composer global require phpmd/phpmd RUN chmod 777 /var/log/ ENV PATH "/root/.composer/vendor/bin:$PATH"試したこと
Imageを
8.0-rc-fpm-alpine
に変更当然というか流石にbuild通らず
RUN docker-php-ext-install -j$(nproc) json
でコケる
- 指定せずとも利用出来るので単純に省いた
- https://wiki.php.net/rfc/always_enable_json
- 現在peclがPHPのイメージから省かれているらしいので使えない
- https://externals.io/message/103977
- PHP7.4かららしいけどPHP7.4でpecl通っていたんだけどな……?
- そのためpeclの代わりにFriendsOfPHP/pickleを利用検討
FriendsOfPHP/pickleの利用
- releaseから取得したpickleだとXdebug-betaのVERSIONがうまく取得出来ずエラーになってしまう
- masteをビルドしてね、とのことだがxdebugのbetaのVERSIONがパースエラーになるため利用出来ない
- そのためForkして自リポジトリで修正した状態で利用することに(PR自体は送信済み、受け入れられると嬉しい)
- 現状pickleはcomposer1でないと利用出来ないのでComposer1のイメージでビルドしてからPHP8.0の方にCOPY
- peclでインストールしていた部分をpickleに変更することでapcu、xdebug-beta、redisのインストールができた
FROM composer:1 as pickle RUN cd /tmp \ && git clone https://github.com/hrs-o/pickle.git \ && cd pickle \ && git checkout update/dumper-stability \ && composer install --no-dev --optimize-autoloader \ && php -d phar.readonly=0 box.phar build FROM php:8.0-rc-fpm-alpine COPY --from=pickle /tmp/pickle/pickle.phar /usr/local/bin/picklehirak/prestissimoがインストールできない
- hirak/prestissimoは現状Composer2に未対応のようなので一旦諦め。
- というかComposer2は高速だからprestissimo使わなくていいよね!ってリポジトリに記載有り。
ということでここまでで一応Dockerfileの修正は終わったのでLaravelのインストールと動作確認をしていく。
Laravelのインストール
$ mkdir src $ docker-compose exec app composer create-project --prefer-dist laravel/laravel . "8.*".envの設定
DB接続とRedisへの接続を試すので設定しておく
.env~~ DB_CONNECTION=mysql DB_HOST=php8-mysql DB_PORT=3306 DB_DATABASE=laravel DB_USERNAME=root DB_PASSWORD=root ~~ REDIS_HOST=php8-redis REDIS_PASSWORD=null REDIS_PORT=6379 ~~migrate実行
$ docker-compose exec app php artisan migrateView・Contoroller・Roterを定義し実行
内容はコミットを参照してください
https://github.com/hrs-o/PHP8.0RC-Laravel/commit/69e1aae936ff77b6c165c68f5f39576301c697f8ひとまずDB接続、Redisへの接続も上手く行っていそう
IDEからリモートデバッグ出来るか確認
今回はIntelliJ Idea(PHPStorm)を対象とする
Xdebugの設定が変わっているので修正
https://3.xdebug.org/docs/upgrade_guide
php.ini[xdebug] - xdebug.remote_enable = 1 + xdebug.mode = debug - xdebug.remote_autostart = 1 + xdebug.start_with_request = yes - xdebug.remote_host = host.docker.internal + xdebug.client_host = host.docker.internal - xdebug.remote_port = 9000 + xdebug.client_port = 9003 xdebug.remote_log = /tmp/xdebug.log xdebug.idekey = PHP8XDEBUGのPort設定
- Languages & Frameworks > PHP > Debug 内のXdebug portを 9003 に変更
PHP Remote Debugの設定
- Edit Configurations を開く
- 左上の+ を押して PHP Remote Debug を選択
- Filter debug connection by IDE keyにチェックを入れる
- IDE keyに PHP8を入力
- Server の横にある .. を押す
- Serversダイアログ左上にある + を押してサーバーを追加
- Hostに
localhost
を設定- Portに
58080
を設定- Use path mappings にチェック
- Project filesのsrcに対応するAbsolute path on the serverに /src を記述してOK
リモートデバッグ実行
- コードの適当なところにブレークポイントを設定
- 作成したPHP Remote Debugをデバッグ実行
- ブレークポイントを設定したコードを通る処理の実行
今回、自分の環境ではステップ実行出来るのは確認済み
まとめ
- 書いてみると単純なことばかりだけどpickle周りはとてもてこずった
- というかほとんどpickleのソースリーディングと修正に時間かった
- 実際利用する際にはライブラリがcomposer2に対応しておらず使えないこともまだ多そうなので何ともだがPHP8に向けて触っていく位の構築はできたんじゃないかなと
参考
【PHP8.0】PHP8.0の新機能
【PHP8】Docker で PECL の YAML 関数(YAML パーサー)をインストールして使う
- 投稿日:2020-11-18T18:44:41+09:00
PHPで管理画面を作る①
- 投稿日:2020-11-18T18:08:25+09:00
ECCUBE4系の、受注一覧で商品コードで検索する。
自分用のメモ程度です。
ECCUBE4系を利用しているのですが、商品コードで検索したいとの要望があったので実施。フォームを増やしたりするのは面倒なので、現状の詳細検索→購入商品名を商品コードにも対応させる方法で進めました。
変更箇所は1箇所のみで、
/src/Eccube/Repository/OrderRepository.php
に OR oi.product_code LIKE :buy_product_nameを追加すれば完了です。// buy_product_name if (isset($searchData['buy_product_name']) && StringUtil::isNotBlank($searchData['buy_product_name'])) { $qb ->andWhere('oi.product_name LIKE :buy_product_name OR oi.product_code LIKE :buy_product_name')//ここに追加 ->setParameter('buy_product_name', '%'.$searchData['buy_product_name'].'%'); }
- 投稿日:2020-11-18T18:06:28+09:00
【Laravel基礎】複数のテーブルの結びつけ【リレーション】
概要
Laravel学習で自分がつまずいた部分を備忘録としてまとめています。
今回は複数のテーブルの結びつけに関する記事です。この記事でわかる事
テーブルの結合方法(リレーション)
①テーブルの主従関係
②テーブルの設定
③モデルの設定以下、記事内容です!
テーブルの主従関係
今回はPostテーブルとCommentsテーブルを用意して、結合します。
こうした複数テーブルの結合を
リレーション
と呼びます。
そして、リレーションにおいて重要なのが主従関係
です。
一方のテーブルが主テーブル・もう一方が従テーブルとなり、
この主従関係によって書くコードが変わってきます。今回の場合だと、Post(記事)に対してComments(コメント)がつくので、
Postテーブルが主、Commentsテーブルが従
という関係になります。
ブログのイメージですね。記事がまず先にあって、それに対してコメントがつく。
Twitterだと、まずユーザーがいて、そこから投稿が生まれる。
それが無いと成り立たない側のテーブルが主テーブル
になります。従テーブルは
主テーブルのIDを保管するフィールド
を用意する必要があります。
このフィールドを外部キー
と呼びます。これを踏まえて、テーブルを設定していきます。
テーブルの設定
今回はPostテーブルとCommentsテーブルを用意しました。
■Postテーブルposts_table.phppublic function up() { Schema::create('posts', function (Blueprint $table) { $table->increments('id'); $table->string('title'); $table->text('body'); $table->timestamps(); }); }まずは主テーブルになるPostsテーブル。
こちらは通常通りですね。ID,title,body,投稿日時を設定しました。■Commentsテーブル
comments_table.phppublic function up() { Schema::create('comments', function (Blueprint $table) { $table->increments('id') ①$table->integer('post_id'); $table->string('body'); $table->timestamps(); ②$table->foreign('post_id') ->references('id') ->on('posts') ->onDelete('cascade'); }); }従テーブルになるCommentsテーブルですが、
従テーブルでは下記2つの設定をする必要があります。①外部キーの作成
主テーブルのIDを保管するためのフィールド
を作成しておきます。
今回はPostテーブルのidを保管するので、'post_id'フィールドとします。②外部キーの参照先を設定
記事が消された際、紐づくコメントも消されるように設定しないといけません。
ここでは外部キーの参照先を指定し、参照先のデータが消えたら、このテーブルのデータも一緒に消えるよう指示しています。
各コードの内容は下記のような感じですね。
// foreign(フィールド) = このフィールドは下記を参照します
// references(フィールド) = 参照先のフィールド
// on(テーブル名) = 参照先のテーブル
// onDelete('cascade'); = 上記が削除されたら該当データも一緒に削除以上がテーブルの設定です。
モデル
次に、モデルの更新です。
まずは主テーブルとなるPostモデルを更新します。
■Postモデル(主)Post.phpclass Post extends Model { protected $fillable = ['title', 'body']; // ①Commentモデルとの紐付け public function comments() { return $this->hasMany('App\Comment'); } }①commentテーブルとリンクさせるためのcomments関数を作成します。
主テーブルでは、
$this -> hasMany(参照先モデル)
とする事で
従テーブルのデータを引っ張ることが可能になります。■Commentモデル(従)
次にCommentモデルを更新します。Comment.phpclass Comment extends Model { // protected $fillable = ['body']; // ②Postモデルへの紐付け public function post() { return $this->belongsTo('App\Post'); } }②Postテーブルとリンクさせるためのpost関数を作成します。
従テーブルでは、
$this -> belingsTo(参照先モデル)
とする事で
従テーブルのデータを引っ張ることが可能になります。belongToは所属すると言う意味なので、主テーブルに従ずると言う感じですね。
リレーションの確認
ここまでで、テーブルが結合できたかターミナルで確認します。
まずはPostテーブル→Commentsテーブルの確認。
ここでは(①) App\Post::find(2)->comments;
によって、
PostテーブルのID:2のデータを呼び出し、
紐づくCommentsテーブルのデータを呼び出しています。ターミナル>>> (①) App\Post::find(2)->comments; App\Comment {#3962 id: "3", post_id: "2", body: "test", created_at: "2020-11-18 17:48:51", updated_at: "2020-11-18 17:48:51", }, ], } >>>こうですね。紐づくコメントの中身が出てきたのでOKです。
次にCommentsテーブル→Postテーブルへのリレーションを確認します。
ターミナル>>> App\Comment::find(3)->post; => App\Post {#3963 id: "2", title: "title 2", body: "body 2", created_at: "2020-11-18 17:55:50", updated_at: "2020-11-18 17:55:50", } >>>こちらも出てきたのでOKです。
まとめ
以上、Laravelにおけるテーブルのリレーションでした。
初めは、hasMany( )とbelongTo( )の違いがよくわからなかったのですが、
主従関係と言う概念を理解すると、違いが腹落ちしました。最後まで読んで頂きありがとうございました!
- 投稿日:2020-11-18T17:03:36+09:00
WindowsのPHPからSQL Serverに接続する方法
目的
普段LAMPP環境でDBはMySQLばかり使っていたのですが、とある案件でDBにSQL Serverを選択することに。
Windows(XAMPP)上のPHP(Laravel)からSQL Severに接続するにあたり、必要なドライバー等を調べたので手順をまとめます。手順
手順は以下の通りです。
環境調査
まずは自分のPHP環境を
phpinfo()
で下調べします。確認するのは以下の3つ。
- PHP Version
- Architecture
- Thred Safety
ドライバーダウンロード
Microsftの公式サイトから
Microsoft SQL Server 用 Drivers for PHP
をダウンロードします。SQL server 2019用
SQL server 2017用
SQL server 2016用
ドライバーの配置
ダウンロードしたexeファイルを実行します。
実行するとファイルが展開されるので、そのファイルの中から環境にあったdllファイルをPHPインストール先のphp\ext\
にコピーします。
【例】XAMMPの場合は、c:\xampp\php\ext
等dllファイルは以下のようなファイル名になっているため、最初に調べた環境に合わせたものを選んでください。
php_pdo_sqlsrv_[PHP Version]_[Architecture]_[Thred Safety].dll
PHP Version : PHP7.3なら73
Architecture : enabledならts
、disabledならnts
Thred Safety :x32
もしくはx64
php.iniの修正
php.ini
ファイルにextensionの記述を追記します。
指定するファイルは先ほど配置したdllファイルです。
以下はスクリーンショットで示した環境の場合の記述例です。php.iniextension=php_pdo_sqlsrv_73_ts_x64.dll確認
Apacheを再起動後、再度
phpinfo()
を表示して反映されているか確認します。
pdo_sqlsrv
が追加されていれば設定完了。
- 投稿日:2020-11-18T13:38:32+09:00
CakePHP 複数レコードを一括保存するsaveAllの使い方
ビュー
form.ctpecho $this->Form->create ( 'User', array ( 'type' => 'post',//POSTとGETの設定 'controller' => 'users',//コントローラーの設定 'action' => 'edit',//アクションの設定 ) ); echo $this->Form->input ( 'User.0.name.'); echo $this->Form->input ( 'User.0.age'); echo $this->Form->input ( 'User.1.name'); echo $this->Form->input ( 'User.1.age'); echo $this->Form->input ( 'User.2.name'); echo $this->Form->input ( 'User.2.age'); echo $this->Form->end('送信');$this->request->data;の中身
$data = array( 'User' => array( 0 => array( 'name' => '太郎', 'age' => 10 ), 1 => array( 'name' => '花子', 'age' => 8 ), 2 => array( 'name' => '二郎', 'age' => 5 ), ) );$data["User"]というように$dataの後ろにモデル名を指定するところがポイントです。
$this->User->saveAll($data["User"]);
- 投稿日:2020-11-18T12:27:48+09:00
404エラーを返すWordPress投稿を修正する方法
WordPressは強力なCMSですが、わずかな調整によりWebサイトにアクセスできなくなる場合があります。ただし、WordPressの問題の解決策を見つけるのは非常に簡単です。WordPressユーザーが直面する最も一般的な問題のいくつかあります。例えば内部サーバーエラーまたはデータベース接続の確立エラーなどです。そして、ほとんどのWordPressユーザーがいつか直面するもう1つの一般的な問題は、WordPressの投稿が404エラーを返すことです。この記事では、404エラーを返すWordPressの投稿を修正する方法を紹介します。
通常、ユーザーはブログのメインページであるWordPress管理エリアにアクセスできますが、単一の投稿にアクセスすると、404 Notfoundエラーが発生する場合があります。そういった場合でもほとんどの場合、慌てる必要はありません。そういった時の原因は主に2つです。
①htaccessファイルが削除された
②書き換えルールに問題が発生したそこで行うべきアクションはパーマリンク設定を修正することです
「設定」⇨「パーマリンク」に移動し、「設定を保存」をする。ただこれだけ。
これにより、パーマリンク設定が更新され、書き換えルールがフラッシュされます。ほとんどの場合、このソリューションはWordPressの投稿404エラーを修正します。ただし、それが機能しない場合は、.htaccessファイルを手動で更新する必要があります。
FTPを使用してサーバーにログインし、/ wp-content /や/ wp-includes /などのフォルダーと同じ場所にある.htaccessファイルを変更します。最も簡単な方法は、アクセス許可を666に変更して、ファイルを一時的に書き込み可能にすることです。次に、元の解決策を繰り返します。権限を660に戻すことを忘れないでください。次のコードを.htaccessファイルに手動で追加することもできます。
BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> # END WordPressローカルサーバーの修正
多くの場合、デザイナーや開発者は、テスト目的でローカルサーバーを使用してコンピューターにWordPressをインストールします。綺麗なパーマリンクを使用したい場合は、MAMP、WAMP、またはXXAMPのApache構成でrewrite_moduleを有効にする必要があります。
以上が404エラーに対しての処理になります。もしよろしかったらコメント待っています。
- 投稿日:2020-11-18T12:24:45+09:00
PHP PSRについて(2020年版)
アクシス Advent Calendar 2020 9日目担当のtuuuuuukenです!
普段の業務ではPHPを書くことが多いのですが、PSR-4やPSR-2など個別の規約については知っているものの
PSRそのものや他の規約についてはあまり知らなかったので調べてみました。PSRとは
PSR(PHP Standards Recommendations, PHP標準勧告)とは、PHP-FIG(The PHP Framework Interop Group, PHPフレームワーク相互運用グループ)が策定しているPHPの規約です。
PSRを定めることによってフレームワークやライブラリ間での相互連携を可能とし、PHP(とそのエコスシステム)を発展させるために存在しています。その一覧はhttps://www.php-fig.org/psr/ 及びhttps://github.com/php-fig/fig-standards で見ることができます。
また、PHP標準勧告なんて名前がついているので必ず守るべき規約のようにも見えますが
PHP-FIG(つまり公式団体ではない)が策定した規約ですので必ず守る必要はありません。PSRの構成
2020年12月現在、承認されたPSRは13個あり、4つの分類で構成されています。
- オートローディング
- インターフェース
- HTTP
- コーディングスタイル
オートローディング
ファイルパスからクラスを自動ロードするための仕様について定められています。
現状はPSR-4の1つのみで、PSR-0については非推奨となっています。PSR-4: Autoloading Standard
自動ロードのためのPHPの名前空間(namespace)及びクラス名の規約について定義されています。
このようなフォーマットになっています。\<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>
インターフェース
フレームワークで提供されることが多い機能(HTTPを除く)についてのインターフェース仕様について定められています。
PSR-3: Logger Interface
ロガーに関するInterfaceについて定められたPSR。
debug
,info
,notice
など8つのログ出力メソッドや、それらのログレベルを受け取るlog
メソッドなどについて定義されています。
有名なライブラリだとMonologなどが実装していますね。PSR-6: Caching Interface
itemの有効期限やキーのフォーマット、サポートすべきデータ型などについて定義されています。
PSR-11: Container Interface
DIコンテナーの標準化について定義されています。
インターフェースはとてもシンプルでget
及びhas
の2つが定義されています。
また、面白いのが推奨される使用方法についても言及している点です。オブジェクトが独自の依存関係を取得できるように、ユーザーはコンテナをオブジェクトに渡すべきではありません。これは、コンテナがサービスロケーターとして使用されることを意味 します。これは一般的に推奨されないパターンです。
気になる方は以下を見てみてください。
https://www.php-fig.org/psr/psr-11/#13-recommended-usage
https://www.php-fig.org/psr/psr-11/meta/#4-recommended-usage-container-psr-and-the-service-locatorPSR-13: Hypermedia Links
ハイパーメディアリンクについて定義されているらしいです。が、いまいち使い道がわかりませんでした。
phalconがPSR-13を実装しているようでしたのでそちらのドキュメントも読んでみましたがよくわからず...(これを気にphalcon初めてみるのも良さそうです)
https://docs.phalcon.io/4.0/ja-jp/html-link#html-link-psr-13PSR-14: Event Dispatcher
Observerパターンの仕組みを提供するためのインターフェースなどについて定義されています。
PSR-16: Simple Cache
キャッシュライブラリ向けのインターフェースなどについて定義されています。
PSR-6もキャッシュについて定義されていますが、PSR-16の方がよりシンプルみたいです。PSR-6はすでにこの問題を解決していますが、最も単純なユースケースで必要とされるものに対してはかなり形式的で冗長な方法で解決しています。このより単純なアプローチは、一般的なケースのための標準化された合理化されたインターフェースを構築することを目的としています。PSR-6から独立していますが、PSR-6との互換性をできるだけ簡単にするように設計されています。
HTTP
PHPでHTTPを扱う上でよく利用する、HTTPクライアントやリクエストハンドラ、ミドルウェアなどについて定められています。
PSR-7: HTTP message interfaces
HTTPのメッセージオブジェクト(HTTPリクエスト及びHTTPレスポンス)について定義されています。
PSR-15: HTTP Server Request Handlers
リクエストハンドラー(MVCで言う所のC)について定義されています。
PSR-7で定義されたHTTPリクエストを引数に受け取り、HTTPレスポンスを返すインターフェースについて定義されています。PSR-17: HTTP Factories
PSR-7で定義されたリクエスト及びレスポンスを生成するためのファクトリに必要なインターフェースについて定義されています。
PSR-18: HTTP Client
HTTPクライアントについての定義です。
簡単に言うとPSR-15の逆(つまりリクエストを送る側について)ですね。コーディングスタイル
コーディング規約について定義されています。PSR-2については上位互換のPSR-12が承認されたため非推奨となっています。
PSR-1: Basic Coding Standard
最低限守るべきコーディング規約について定義されています。
PHPタグ(<?php
or<?=
)についてやファイルエンコード(BOM無しUTF-8)などなど。PSR-12: Extended Coding Style
細かいコーディング規約及びコーディングスタイルについて定義されています。
use文の順番(クラス、関数、定数の順)やextendsとimplementsは同じ行に1行で書きましょう、などなど。
PSR-2と比べるとPHP7で追加された引数と戻り値の型宣言の規約などが追加されています。まとめ
使わないPSRについはあまり知る機会がないのでこの機会に知ることができて楽しかったです。
PHP8がリリースされたので新たなPSRも投稿されそうですね。明日はmichidaさんの「スキャフォールドツール作った話」です!
それではみなさん良いPHPライフを!
おまけ
PSR一覧
ACCEPTED(承認済み)
番号 タイトル リンク 1 Basic Coding Standard https://www.php-fig.org/psr/psr-1/ 3 Logger Interface https://www.php-fig.org/psr/psr-3/ 4 Autoloading Standard https://www.php-fig.org/psr/psr-4/ 6 Caching Interface https://www.php-fig.org/psr/psr-6/ 7 HTTP Message Interface https://www.php-fig.org/psr/psr-7/ 11 Container Interface https://www.php-fig.org/psr/psr-11/ 12 Extended Coding Style Guide https://www.php-fig.org/psr/psr-12/ 13 Hypermedia Links https://www.php-fig.org/psr/psr-13/ 14 Event Dispatcher https://www.php-fig.org/psr/psr-14/ 15 HTTP Handlers https://www.php-fig.org/psr/psr-15 16 Simple Cache https://www.php-fig.org/psr/psr-16 17 HTTP Factories https://www.php-fig.org/psr/psr-17 18 HTTP Client https://www.php-fig.org/psr/psr-18 DRAFT(草案)
番号 タイトル リンク 5 PHPDoc Standard https://github.com/php-fig/fig-standards/blob/master/proposed/phpdoc.md 19 PHPDoc tags https://github.com/php-fig/fig-standards/blob/master/proposed/phpdoc-tags.md ABANDONED(放棄)
番号 タイトル リンク 8 Huggable Interface https://github.com/php-fig/fig-standards/blob/master/proposed/psr-8-hug/ 9 Security Advisories https://github.com/php-fig/fig-standards/blob/master/proposed/security-disclosure-publication.md 10 Security Reporting Process https://github.com/php-fig/fig-standards/blob/master/proposed/security-reporting-process.md DEPRECATED(非推奨)
番号 タイトル リンク 0 Autoloading Standard https://www.php-fig.org/psr/psr-0 2 Coding Style Guide https://www.php-fig.org/psr/psr-2
- 投稿日:2020-11-18T09:45:51+09:00
炎上している件とは関係ないけどforとforeachの違いをまとめてみた
前回の記事 → 転生できないからVimで2つのファイルの差分を確認してみた
ほんと炎上とは何も関係ないです←
forとforeachって何が違ってどう使うのかややこしくなった時期が
過去あったなぁと思ったのでまとめました
因みに個人的な好みとしてforeachの方が使うことが多いです^ - ^for
公式 → https://www.php.net/manual/ja/control-structures.for.php
for ($i = 1; $i <= 10; $i++) { echo $i; }基本的な使い方は上記の通りで
$iが1からカウント?スタートして10になるまで{}の中の処理を繰り返します。
自分で繰り返す回数を指定出来る様なイメージで解釈しています。foreach
公式 → https://www.php.net/manual/ja/control-structures.foreach.php
<?php $arr = array(1, 2, 3, 4); foreach ($arr as &$value) { $value = $value * 2; } // $arr は array(2, 4, 6, 8) となりますforeachは配列の中の要素やオブジェクトなど
要するに配列の中に入るものであればその配列の数だけ{}の中の処理を
繰り返していきます。
個人的にはこれが工夫して使えると
俺ってプログラマーじゃね?って勘違いできるので是非とも使いこなしてみてください。forとforeachの違い
比べてみて大きな違いは数字の値分ループするのか
配列の数だけループするのかといった違いが大きいでしょうかどういうときに使うの?と問われると
内容次第ですが多分どちらも使おうと思えば使えるのかなと思います。
これまでの経験の中で言わせてもらうと
forやforeachの中で変にifでネストしまくったコードは
読みづらいなぁと思うので僕はそんなコードを書かない様に意識をしています。
全く使わないことは無理なので適度な加減が必要ですね!
- 投稿日:2020-11-18T05:15:03+09:00
YouTube Data API v3 クォータ制限について
プログラミング初心者が自身で作りたいwebページの作成中に
疑問に思ったこと、問題解決したことを書いていきます。
間違っている点も多々あると思います。突然、YouTube Data API v3 で取得していた動画情報が取得できなくなってしまった
YouTubeの動画URLを入力すればカテゴリ別に仕分けしてDBに登録し、リスト形式で表示するというwebアプリを作った。
動画情報をYouTube Data API v3を用いてリスト形式で表示させるというものだったが
突然動画情報が取得できなくなってしまった。1.原因の調査
原因を調査したところ、GoogleのAPIでは1日に使用できる「クォータ(Queries)(?)」の制限があるとのこと。
こちらにアクセスしたところ確かにいっぱいだった・・・
(連日上限まで気づかずに使っていたみたい・・・)1日のクォータ数の上限は10,000しかないみたい・・・
上限の引き上げもGoogle側に申請できるみたいだったが、英語での申請とのことで敷居が高い・・・
ならば自身のコードの見直しをしてみた。2.コードの見直し
自身のwebアプリは
1.youtube動画のURLをデータベースに保存
↓
2.データベースに保存されたURLをもとに動画情報取得(サムネイル、投稿者、タイトルなど)
↓
3.カテゴリ別に取得した情報を表示させる
といったものだ。
この「2」の箇所でAPIでの取得を行っていることが原因でクォータの上限に簡単に達してしまう模様。
これでは公開したらまともに動作しなくなってしまう・・・3.コードの改善
コードというより最早設計の問題だった。
APIでの動画情報取得をできるだけ少なくするためにデータベースの保存時のみ動画情報取得するように設計し直した。
1.youtube動画のURLから動画情報(サムネイル、投稿者、タイトルなど)を取得し、データベースに保存
↓
2.データベースに登録された動画情報を動画URLごとに表示させる
これで、動画リストを開くたびにAPIが使用されることがなく、クォータの使用量もかなり余裕ができた。
- 投稿日:2020-11-18T05:15:03+09:00
YouTube Data API v3 クォータ制限について その1
プログラミング初心者が自身で作りたいwebページの作成中に
疑問に思ったこと、問題解決したことを書いていきます。
間違っている点も多々あると思います。突然、YouTube Data API v3 で取得していた動画情報が取得できなくなってしまった
YouTubeの動画URLを入力すればカテゴリ別に仕分けしてDBに登録し、リスト形式で表示するというwebアプリを作った。
動画情報をYouTube Data API v3を用いてリスト形式で表示させるというものだったが
突然動画情報が取得できなくなってしまった。1.原因の調査
原因を調査したところ、GoogleのAPIでは1日に使用できる「クォータ(Queries)(?)」の制限があるとのこと。
こちらにアクセスしたところ確かにいっぱいだった・・・
(連日上限まで気づかずに使っていたみたい・・・)1日のクォータ数の上限は10,000しかないみたい・・・
上限の引き上げもGoogle側に申請できるみたいだったが、英語での申請とのことで敷居が高い・・・
ならば自身のコードの見直しをしてみた。2.コードの見直し
自身のwebアプリは
1.youtube動画のURLをデータベースに保存
↓
2.データベースに保存されたURLをもとに動画情報取得(サムネイル、投稿者、タイトルなど)
↓
3.カテゴリ別に取得した情報を表示させる
といったものだ。
この「2」の箇所でAPIでの取得を行っていることが原因でクォータの上限に簡単に達してしまう模様。
これでは公開したらまともに動作しなくなってしまう・・・3.コードの改善
コードというより最早設計の問題だった。
APIでの動画情報取得をできるだけ少なくするためにデータベースの保存時のみ動画情報取得するように設計し直した。
1.youtube動画のURLから動画情報(サムネイル、投稿者、タイトルなど)を取得し、データベースに保存
↓
2.データベースに登録された動画情報を動画URLごとに表示させる
これで、動画リストを開くたびにAPIが使用されることがなく、クォータの使用量もかなり余裕ができた。
- 投稿日:2020-11-18T00:39:02+09:00
Laravel で「Server error: GET http://cabinet.laravel.com/latest.zip resulted in a 522 Origin Connection Time-out response:」エラー
Laravel で久しぶりに laravel new blog のコマンドを打ってプロジェクトを作ろうとしたらタイトルのエラーが発生した。
laravel% laravel new blog Crafting application... In RequestException.php line 113: Server error: `GET http://cabinet.laravel.com/latest.zip` resulted in a `52 2 Origin Connection Time-out` response: <html> <head><title>522 Origin Connection Time-out</title></head> <body bgcolor="white"> <center><h1>522 Origin Conne (truncated...) new [--dev] [--auth] [-f|--force] [--] [<name>]困ったらstackoverflow
Laravel News に載っている通りインストーラーアップデートしなさいって書いてありました。
https://stackoverflow.com/questions/64686037/why-do-i-get-a-laravel-error-while-creating-a-new-project解決方法composer global require "laravel/installer:^4.0"上ので私は解決しました。それでダメならアンインストールとインストールとか試しなさいだそうです。
【詳細は下記参照】
https://laravel-news.com/updating-the-laravel-installer
- 投稿日:2020-11-18T00:18:07+09:00
JavaScript PHP 正規表現を使用した文字列置換でが何を指しているかわからなかったので調べて簡単にまとめる
目的
- JavaScriptとPHPの文字列置換でどうして$1にヒットした文字列が入っているのかわからなかったので調べてみた
前提情報
- JavaScriptは下記の方法で確認した
- PHPは下記のサイトで確認した。
- 下記の内容を実装中に$1になぜヒット内容が入っているか気になった。(本来良くないことだが$1にすればヒットした内容が格納されているということを一つ覚えで実装してしまった。)
確認
Chromeの検証モードのコンソールでで下記を実行してみる。
/(https?:\/\/[^\s]*)/g.exec('https://qiita.com/miriwo は筆者のQiitaのホームです');下記の出力が得られた。
画像
キー0とキー1にヒットした文字列「https://qiita.com/miriwo」が格納されている。
正規表現部分を下記のように修正して実行してみる。
/https?:\/\/[^\s]*/g.exec('https://qiita.com/miriwo は筆者のQiitaのホームです');下記の出力が得られた。
キー0にのみヒットした文字列
https://qiita.com/miriwo
が格納されている。どうやら$1などは正規表現部分のいくつめの括弧でマッチしたものかを表しているようである。
下記のリンクの「引数としての文字列指定」の「$n」の記載にそれっぽいことが書かれている。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/replace
パターン 挿入 $n n は 100 未満の正の整数です。第一引数が RegExp オブジェクトだった場合に n 番目の括弧でキャプチャされた文字列を挿入します。1, 2, ... でインデックスされることに注意してください。 $2を作り出すために意図的に下記を実行してみる。ドキュメントの記載どおりなら$2はキーとしては存在するが、検索条件を指定していないので何も値が格納されないはずである。
/(https?:\/\/[^\s]*)()/g.exec('https://qiita.com/miriwo は筆者のQiitaのホームです');予想通り下記のように出力された$2はキーとして存在しているが値は格納されていない。
では$0は何を指しているのかを確認するために下記を実行してみた
/(https?)(:\/\/[^\s]*)/g.exec('https://qiita.com/miriwo は筆者のQiitaのホームです');下記のような出力が得られた。下記の結果から$0は括弧に関係なく正規表現部分全体でヒットした文字列が格納されているものであると言える。
個人のブログではあるがまとめてくださっている方がいた。「$0 は正規表現にマッチした文字列全体を表し、$1, $2, $3 は、それぞれ1番目、2番目、3番目の左括弧で囲まれた部分のパターンに一致した部分文字列を表します。」と書かれているのでおそらく自分の見解は間違えていないように思える。
付録
- 自分がよく使うPHPでは正規表現を使った置換はどのように行われるのかが気になったので公式ドキュメントを呼んでみた。
- PHPで正規表現を用いた文字列置換を行うときは
preg_replace()
メソッドを使用するようである。下記のように当該メソッドを使用する。
preg_replace(検索条件文字列, 置換後の文字列, 置換対象文字列);「検索条件文字列」は正規表現を用いて記載するものでありJavaScriptと同じようにデリミタでくくって記載する。
そして検索にヒットしたものが入ってくるキーも$0や$1などJavaScriptと一緒のようだった。公式ドキュメントのリンクを下記に記載し抜粋したもの載せる。(PHPのドキュメントのほうがわかりやすく書いてくれている気がした。先にこっちを読めばよかった。)
https://www.php.net/manual/ja/function.preg-replace.php
replacement では、 \n 形式または $n 形式で参照を指定することができます。 後者の形式の方が好ましい形式です。各参照は、n 番目のキャプチャ用サブパターンにマッチしたテキストにより置換されます。 n は 0 から 99 までとすることができ、 \0 または $0 は パターン全体にマッチするテキストを参照します。キャプチャ用サブパターンの番号 については、その左括弧が左から右に(1から)カウントされます。 string に含まれるバックスラッシュリテラルは、エスケープが必須であることに注意して下さい。
試しに下記を実行してURL部分が検索にヒットするか確認してみた。
echo preg_replace('/(https?:\/\/[^\s]*)/', '<a href="$1">$1</a>', 'https://qiita.com/miriwo は筆者のQiitaのホームです');下記のように出力されたので問題無く置換できているようである。
<a href="https://qiita.com/miriwo">https://qiita.com/miriwo</a> は筆者のQiitaのホームです
ヒットした文字列が格納されているキーがJavaScriptのものと同じであるのか確認してみる。下記を正規表現部分と置換後の文字列をいじって下記を実行してみる。
echo preg_replace('/(https?)(:\/\/[^\s]*)()/', '$0 - $1 - $2 - $3 ', 'https://qiita.com/miriwo は筆者のQiitaのホームです');下記のように出力された。1つ目のハイフンまでが$0であり、すべての正規表現にヒットしたのでURLがフルで表示されている。1つ目から2つ目のハイフンまでが$1であり1つ目の括弧のヒット部分が表示されている。2つ目から3つ目のハイフンまでが$2であり2つ目の括弧のヒット部分が表示されている。最後のハイフンのあとは$3であり3つ目の括弧のヒット部分が表示されるが括弧の中に何も記載されておらず何もヒットしていないので何も出力されていない。
https://qiita.com/miriwo - https - ://qiita.com/miriwo - は筆者のQiitaのホームです
まとめ
- JavaScriptでもPHPでも正規表現を使った文字列置換の$1とか$2とかは左から数えた正規表現の括弧の数にリンクしており、それぞれ$1には1つ目の括弧の正規表現にヒットした文字列が、$2には2つ目の括弧の正規表現にヒットした文字列が格納れている。$0だけは少し特殊で括弧に関係なくデリミタで区切られた正規表現すべてを通してヒットした文字列が格納される。