- 投稿日:2019-11-15T20:55:09+09:00
Wordpress5.3で勝手に画像が縮小されるのを防止!
ええっ
なんてことを. 自慢の4K画像を上げたら突然縮小されるようになってしまった?
解決法
wp-admin/includes/image.php
の243行目にある$threshold = (int) apply_filters( 'big_image_size_threshold', 2560, $imagesize, $file, $attachment_id );をコメントアウトしましょう. これで縮小されないはず?
https://core.trac.wordpress.org/browser/trunk/src/wp-admin/includes/image.php?rev=46565#L226
- 投稿日:2019-11-15T20:31:45+09:00
PHPのMockeryを使ってモックとスタブの違いを噛み砕いて説明する
はじめに
PHPのモックフレームワークであるMockeryを使ったテストコードとサンプルケースで、モックとスタブの違いを自分なりに噛み砕いて説明してみます。
対象読者はMockery使ったことあるけどいまいちモックとスタブの違いがわからない人です。モックとは
テスト対象が依存している他のクラスのメソッドを、テスト対象が期待通り呼び出しているか検査するためのもの。
似てるけど違う、スタブとは
テスト対象が依存している他のクラスの挙動に影響を受けないように、事前に定められた応答をするもの。
モックと違うところは、検査したい観点が違う。モックはテスト対象が依存クラスを使って期待したメッセージングをしているか確認する。わからん
コードで説明してみる
Aさんは「2つの整数を足し算して答えが3の倍数ならアホになる」振る舞いをする人だと仮定します。
Aさんは「計算できる何か」が無いと足し算できません。「計算できるなにか」に依存している状態です。
コードで表すと下のようになります。class Aさん { private $計算できるなにか; /** * これをテストしたい */ public function 足し算して答えが3の倍数ならアホになる(int $number1, int $number2): string { $result = $this->計算できるなにか->足し算する($number1, $number2); return $result % 3 === 0 ? 'アホになった' : 'アホじゃない'; } public function __construct(計算できるなにか $計算できるなにか) { $this->計算できるなにか = $計算できるなにか; } }計算できる何かのコードは下記です。
interface 計算できるなにか { public function 足し算する(int $number1, int $number2): int; } class 電卓 implements 計算できるなにか { public function 足し算する(int $number1, int $number2): int { return $number1 + $number2; } }Aさんのやることは2つあります。
- 計算できるなにかに、足し算を依頼する
- 答えが3の倍数か判断して、アホになるかどうか判断する
テストを書いていきましょう
class Test_Aさん extends TestCase { public function test_2つの整数を足し算して答えが3の倍数ならアホになること() { $電卓 = new 電卓(); $Aさん = new Aさん($電卓); $アホじゃないと予想 = 'アホじゃない'; $this->assertEquals($アホじゃないと予想, $Aさん->足し算して答えが3の倍数ならアホになる(1, 1)); $アホになってる予想 = 'アホになった'; $this->assertEquals($アホになってる予想, $Aさん->足し算して答えが3の倍数ならアホになる(1, 2)); } }良さそうに見えるけど・・・
もし「電卓」にバグがあり正しく動作していなかったら、Aさんのテストも失敗してしまいます。
Aさんは悪くなくて、電卓が悪いのに・・・じゃあどうすれば・・・
ここで使うものがスタブです。
事前に定められた応答をするものを準備することで、電卓にバグがあるかどうかに関係なくAさんのテストができます。class Test_Aさん extends TestCase { public function test_2つの整数を足し算して答えが3の倍数ならアホになること() { $電卓 = Mockery::mock(計算できるなにか::class); // 足し算するが1回目呼ばれたら2を必ず返す。足し算するが2回目呼ばれたら必ず3を返す $電卓->shouldReceive('足し算する')->andReturn(2, 3); $Aさん = new Aさん($電卓); $アホじゃないと予想 = 'アホじゃない'; $this->assertEquals($アホじゃないと予想, $Aさん->足し算して答えが3の倍数ならアホになる(1, 1)); $アホになってる予想 = 'アホになった'; $this->assertEquals($アホになってる予想, $Aさん->足し算して答えが3の倍数ならアホになる(1, 2)); } }やった!電卓に依存せずにAさんのテストができた!
電卓はスタブのため、必ず設定した値を返します。
偽の電卓ですね。
電卓のバグの影響を受けずにAさんのテストができました。じゃあモックは?
このページの上で「テスト対象が依存している他のクラスのメソッドを、期待通り呼び出しているか検査するためのもの」と書きました。
今回のAさんの例で例えると「Aさんが依存している計算できるなにかの足し算メソッドを、期待通り呼び出しているか検査する」となります。Aさんって本当に「計算できるなにか」を正しく想定通り使ってるの?
を確かめるテストになります。
Aさんが本当に電卓を正しく想定どおり使ってるか確かめる
class Test_Aさん extends TestCase { public function test_Aさんは計算できるなにかを正しく使えているのかな() { $電卓 = Mockery::mock(計算できるなにか::class); // 足し算するメソッドが、引数が1と2で、1回だけ実行されるかな? $電卓->shouldReceive('足し算する')->with(1, 2)->once()->andReturn(3); $Aさん = new Aさん($電卓); $Aさん->足し算して答えが3の倍数ならアホになる(1, 2); } public function tearDown() { Mockery::close(); } }Aさんは正しく電卓を使えていた!
Aさんが電卓を正しく想定どおり使っていることを確認できました。
(上のテストケースは、検査対象のメソッドが想定された引数で想定された回数実行されなかったらテストが失敗します)モックとスタブはどのように使い分ければいいのか
これらの使い分けの観点は、Aさんをテストするときに何に着目しているかだと思います。
Aさんが3の倍数のときにアホになるかどうか確かめたい。でも依存している他のクラスの影響を受けたくない。そんなときはスタブ。
Aさんが依存している計算できるなにかを正しく使えているか確かめたい。依存しているオブジェクトが想定通りの値を受け取って想定回数呼ばれてることを確かめたい。そんなときはモック。
こんな感じかと。最後に
私個人は、モックは外部が関係する部分でよく使います。
メール送信とか、外部API通信とかですね。
テスト実行のたびにメールが実際に送信されたら面倒だし。モックとスタブを正しく使い分けて、よいテストを書いていきたいものですね。
(ここで書いたテストケースはコピペで動きます。tearDownにMockery::close()を書いておいてください)
- 投稿日:2019-11-15T20:04:15+09:00
【Laravel5.8】複数のデータベースに接続するときは全てのモデルに`$connection`を書こう
先日のEagerロード先テーブルは必ず主キーもSELECTしないといけないって記事を見るとわかりますが、Eagerロードでは複数テーブルを結合するのにJOINを使わず、データを別々に取ってきて後から合体させています。
つまり、これは異なるデータベースのテーブルに疑似リレーションを張れるのでは?
テーブルAclass TableA extends Model{ // テーブル名 protected $table = 'table_a'; /** * リレーション * @return BelongsTo */ public function tableb() { return $this->belongsTo(TableB::class, 'b_id', 'id'); } }別DBのテーブルBclass TableB extends Model{ // データベースがちがう protected $connection = 'other_database'; // テーブル名 protected $table = 'table_b'; /** * リレーション * @return BelongsTo */ public function tablea() { return $this->belongsTo(TableA::class, 'a_id', 'id'); } }コントローラから呼び出す。
コントローラ$columnsAB = TableA->with('table_b')->get(); $columnsBA = TableB->with('table_a')->get();さて、この動作はどうなるでしょうか?
答えは、
$columnsAB
は想定通りに取得できる、$columnsBA
は取得できない、です。
わかりづら!どうしてこんなことになるのでしょうか。
TableA→TableBの順で呼んだ場合、まずデフォルトのDBからTableAを呼び、次いでTableBを見に行った時点でDBが'other_database'に切り替わるのでTableBのデータも正常に取得できる、ということになります。
逆にTableB→TableAの順で呼んだ場合、TableBを見に行った時点でDBが'other_database'に切り替わってTableBのデータを正常に取得し、次いでTableAを見に行きますがDBは'other_database'のままでありTableAが読めない、となります。
原因はTableAに
$connection
が書かれていないせいです。
普段$connection
を書いてないときは暗黙的にdefault
が選ばれるので、何も書かずとも問題なく動作します。
しかし一度でも別のデータベースが選ばれると、その後は$connection
を書かないかぎりそのDBが選ばれ続けてしまうみたいです。まとめ
複数のデータベースに接続する可能性があるときは、デフォルト接続先にも必ず
$connection
を書いておくと安全かもしれない。
- 投稿日:2019-11-15T19:42:32+09:00
CodeIgniterに独自のログレベルを追加する方法
記事作成の経緯
Codeigniterには
log_message()
というログファイルにメッセージを記述する方法がある。Error Handling
https://codeigniter.com/user_guide/general/errors.html?highlight=log_message#log_messageだが、この仕様が以下の問題を抱えている。
$config['log_threshold']
の値により出力されないログがある
(1に設定した場合はERRORしか出力されない)- INFO, DEBUGにはCodeIgniter自身のログも出力されて読みづらいので、
$config['log_threshold'] = 1
としたい。- 用意されているものが3つ(ERROR, DEBUG, INFO)しかなく、出したいログに相応しい名前を選べない
※例えばメールの送信結果だったら「EMAIL」とか、管理画面のログなら「MANAGE」とかにしたい。そこで、簡単にカスタムログを出力する方法まとめた。
1. Logクラスの拡張
application/core に MY_Log.php を追加する
※「MY_」部分は config.php の$config['subclass_prefix']
に従う。2. My_Log.php にカスタムログを記述
Logクラスを継承して1行追加するだけ。
<?php defined('BASEPATH') OR exit('No direct script access allowed'); class MY_Log extends CI_Log { protected $_levels = array('ERROR' => 1, 'DEBUG' => 2, 'INFO' => 3, 'ALL' => 4, 'EMAIL' => 1, 'MANAGE' => 1); }
- ERROR, DEBUG, INFO, ALL までは system/core/Log.php のもの(必須)。
- その配列の後ろに
$key => $level
の形で追記していく。$level
は$config['log_threshold'] = 1
を想定しているのでERRORと同じ1にした。3. 動作確認
任意のプログラム中にログ出力コマンドを書いてアクセス。
// メール送信プログラム if($mail_sended) { log_message('email', 'sended!'); } else { log_message('email', 'failed: 失敗原因とかを記載'); }ログファイルには以下のように記載される
EMAIL - 2019-11-15 19:40:06 --> sended!類似記事
- CodeIgniterのログを独自カテゴリーに分けて出力する
https://qiita.com/Go-Noji/items/dbf248f2fd55ed48ca58
- 投稿日:2019-11-15T18:03:49+09:00
PHP→Pythonの呼び出し時に'ascii' codec can't encode characters in position xx-xx: ordinal not in range(128)
Pythonでスクリプト書いて、PHPから呼び出したい。
Python側をコンソール上で動作確認して、
PHPでフロント作って呼び出そうとしたらこれ'ascii' codec can't encode characters in position 28-32: ordinal not in range(128)ascii?コンソール上で動くけど?
locale変更してもダメ試しにpython実行コマンドで
LC_ALL=\"ja_JP.utf8\" python test.pyのように定義したら動いた。
分からんわこんなん。
P.S. 上司ありがとう。
- 投稿日:2019-11-15T17:28:49+09:00
laravel サーバ環境構築基礎
少なくとも一つのフレームワークを覚えようと思って、複数のフレームワークの中ララベルに興味ありました。
いろいろ調べたところ、テスト環境の情報が多い、サーバ環境構築の情報が少ない、バラバラです。
一応、苦戦二日間やっと構築成功しました、以下に纏めます。共有致します。この手順で恐らく一発でできそうな感じ。
OS CentOS 6.10 32bit
php5.6.40
laravel5.4
mysql5.6/40
Apache2.2.15■ composer インストール
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
composer■ laravel インストール
composer global require "laravel/installer"■ プロジェクトを作成
composer create-project --prefer-dist laravel/laravel laravelapp(laravelapp プロジェクト名です)
■ 権限変更
chmod 777 storage -R
chmod 777 bootstrap/cache -R■ httpd.conf 編集
AllowOverride None -> AllowOverride All
(ご自身の環境合わせ設定)■ config/app.php 編集
timezone = 'Asia/Tokyo',
locale = 'ja',
'fallback_locale' => 'en',■ laravelapp/.env 編集
DB_DATABASE=mydb
DB_USERNAME=root
DB_PASSWORD=test
(必要応じて)■ laravelapp/app/Providers/AppServiceProvider.php 編集
public function boot()
{
Schema::defaultStringLength(191); //追加■ httpd 再起動
リモートサーバのURLでlaravelの起動画面と任意の
web.phpの指定のパスで動作確認OK。(完了)
次は関連のAPP作成予定です。
- 投稿日:2019-11-15T17:07:13+09:00
学習のアウトプット #1
はじめに
なぜQiitaでの投稿を始めたかというと、現在PHP/Laravel絶賛勉強中なのですが教材を見てコードを書いてるばかりで全然アウトプットしておらず、学習のしたことがイマイチ身についてないなぁと感じたからです。
早速アウトプットしていこうと思うのですが、今回はOSについて書こうと思います。
ある時プログラミングを学習していて、OSって言葉が目に付いて「あれ、OSってなんだっけ??」と思ったためです。
OSとは
OSとはオペレーティングシステムの略で、PCを管理・操作するシステムです。
よく聞くのはwindows,macOS,linuxだったり、スマホのiOSやAndroidもOSです。OSがないとPCは動きません。
昔のゲームに例えるとゲーム機本体があってもソフトがないからゲームできないみたいな感じですかね。OSの機能
- 入出力の制御
キーボードをどのキーを何回押したか、マウスをどの方向にどれだけ動かしたか、などのキーボードやマウスの入出力の制御やモニターの画面表示の機能はOSが担っています。この機能によって画面にエディタが表示され、コードを書くことができ、カーソルを動かすことができるわけです。
- ファイル管理 フォルダやファイルの管理もOSの役割です。
この機能のおかげで、コードを書いたファイルをフォルダに入れたり出したり、保存や表示することができます。
タスク管理
ブラウザでググりながらエディタでコードを書いていく、というように複数のアプリを表示させたり、アプリの起動や終了等の管理・制御もOSの機能です。その他にも様々な機能
上記以外にもマウスやキーボード、外付けのハードディスクなどのハードウェアの管理などPCの基本的な部分はOSが担っています。さいごに
とまぁこんな感じで学習のアウトプットとして投稿を続けていけたらと思っています。
- 投稿日:2019-11-15T16:31:24+09:00
docker-composeで簡単に環境構築Apache2.4+PHP7.1+PostgreSQL9.6
仕事で上記の環境が必要になったので
もうやりたくない備忘録として残す環境
- Mac for Docker
- Apache2.4
- PHP7.1
- PostgreSQL9.6
構成
ディレクトリ構成はこんな感じです。
Dockerfile
docker/web
にDockerfile
という名前のファイルを作成し以下の内容で記述PHPのバージョンを変えたければFROMの
php:7.3-apache
という風に変えればいけるはず。docker/web/DockerfileFROM php:7.1-apache COPY ./php.ini /usr/local/etc/php/ RUN set -ex apk --no-cache add postgresql-dev libpq-dev && \ apt-get update && apt-get install -y libpq-dev \ vim \ less \ && docker-php-ext-install pdo pdo_pgsql pgsql mbstring同階層で
php.ini
ファイルを作成します。docker/web/php.ini[Core] display_errors = On error_reporting = E_ALL error_log = /var/log/apache2/error.log log_errors = On [Date] date.timezone = 'Asia/Tokyo' [mbstring] mbstring.language = Japanese mbstring.internal_encoding = auto mbstring.http_input = auto mbstring.http_output = auto mbsting.encoding_translation = Off mbstring.detect_order = autodocker-compose.yml
PostgreSQLのバージョン変えたければ
image: postgres:9.3
の部分を変更してください。
またはポートを変えたいときはports: -8110:80
を変更してください。docker-compose.ymlversion: '3' services: web: build: ./docker/web/ ports: - 8110:80 volumes: - .:/var/www/html depends_on: - db db: image: postgres:9.3 ports: - 5433:5432 volumes: - ./docker/db:/docker-entrypoint-initdb.d公開ファイルを編集
適当に今回は
index.php
を上げるのでphpinfo
を表示させようindex.php<?php phpinfo();実行
実行してみる
docker-compose up -d
立ち上がってるか確認してみる
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0e5271d55548 4b77e94c903a "docker-php-entrypoi…" 38 minutes ago Up 38 minutes 0.0.0.0:8110->80/tcp test_web_1 d7ae129bf106 postgres:9.3 "docker-entrypoint.s…" 38 minutes ago Up 38 minutes 0.0.0.0:5433->5432/tcp test_db_1ブラウザ確認
先ほどのdocker-compose.ymlをそのまま使用している人なら以下のリンクから飛べるはず
localhost:8110下の画面が表示されていれば成功
マシン接続
コンテナ内に入ってみる
$ docker exec -it test_web_1 bash # ls # docker docker-compose.yml index.php最後に
docker-compose.ymlが便利すぎて辛い。
- 投稿日:2019-11-15T11:30:12+09:00
phpのmb_strimwidth
convenient build-in function
テキストデータを一定の文字数で[...]したい時に便利。
こういうのがあるのは知りませんでした。
勉強不足ですね。$text = "春はあけぼの。やうやう(ようよう)白くなりゆく山ぎは(やまぎわ)、少し明(あ)かりて、紫(むらさき)だちたる雲の細くたなびきたる。 春は、明け方(あけがた)が良い。 だんだん、白くなっていく山ぎわが、 少し明るくなって、紫がかった雲が、細くたなびいているのが、"; echo mb_strimwidth($text,0,120,"...","UTF-8"); //春はあけぼの。やうやう(ようよう)白くなりゆく山ぎは(やまぎわ)、少し明(あ)かりて、紫(むらさき)だちたる雲の細く...
- 投稿日:2019-11-15T11:30:12+09:00
mb_strimwidth in PHP
convenient build-in function
テキストデータを一定の文字数で[...]したい時に便利。
こういうのがあるのは知りませんでした。
勉強不足ですね。$text = "春はあけぼの。やうやう(ようよう)白くなりゆく山ぎは(やまぎわ)、少し明(あ)かりて、紫(むらさき)だちたる雲の細くたなびきたる。 春は、明け方(あけがた)が良い。 だんだん、白くなっていく山ぎわが、 少し明るくなって、紫がかった雲が、細くたなびいているのが、"; echo mb_strimwidth($text,0,120,"...","UTF-8"); //春はあけぼの。やうやう(ようよう)白くなりゆく山ぎは(やまぎわ)、少し明(あ)かりて、紫(むらさき)だちたる雲の細く...
- 投稿日:2019-11-15T06:42:46+09:00
Laravelでartisanコマンドを自作してCommandを体感する
Laravelを勉強してて、php artisan という不思議なコマンドを何気なく使っていましたが
これを自作できるということで、自作した勉強メモです。artisanコマンド一覧を見てみる
まずはどんなコマンドがあるのか見てみることにしました。
php artisan listこのコマンドを使うことで、どんなコマンドが使えるのか、またそのコマンドの説明が表示されます。
Laravel Framework 6.0.4 Usage: command [options] [arguments] ... make make:channel Create a new channel class make:command Create a new Artisan command make:controller Create a new controller class make:event Create a new event class make:exception Create a new custom exception class make:factory Create a new model factory make:job Create a new job class make:listener Create a new event listener class make:mail Create a new email class make:middleware Create a new middleware class make:migration Create a new migration file make:model Create a new Eloquent model class ...ズラーと表示されました。中には馴染みのあるmake:migrationなんかもあります。
Create a new migration fileと書いてあるので、コマンドの簡単な説明も一緒に表示されていることがわかります。この中に
make:command Create a new Artisan commandというのがあるので、これを使ってコマンドを作ります。
php artisan make:command SampleCommand Console command created successfully.これで
app/Console/Commands/SampleCommand.php
というファイルが作成されました。
ここにどんなコマンドなのか具体的に記載していきます。コマンドの名前の指定や、説明、handleメソッドにコンストラクタがあります。
どんなコマンドにするか考える
せっかくなので何かできるコマンドにしたかったので
テーブルのレコードをアップデートするコマンドにしました。jsonファイルを読み込ませて
その内容に従ってテーブルのレコードをアップデートします。
アップデートが終わったらjsonファイルをDoneフォルダに移動させます。まぁ、実用性はないですが、、、。。。
{ "table": "customers", "where": "id", "conditions":"1", "update": "name", "value":"高田健志" }コマンドファイルを編集する
まずは名前を変更します。
SampleCommand.php//protected $signature = 'command:name'; protected $signature = 'myupdate:table {filename}';これがartisanコマンドになります。
使うときはphp artisan myupdate:table Sample.jsonというようになります。
{arg}で引数を指定することもできます。次にコマンドの説明を変更します。
SampleCommand.php//protected $description = 'Command description'; protected $description = 'update table';この状態でもう一回listを表示してみます。
myupdate myupdate:table update table登録したコマンド名と説明が表示されています。
あとはコマンドの処理を実装するだけです。コマンドの処理の中身はhandleメソッドに書いていきます。
SampleCommand.php/** * Execute the console command. * * @return mixed */ public function handle() { //引数のファイル名を取得する $filename = $this->argument('filename'); //infoは緑色の文字でメッセージを表示する $this->info("start update table command!"); //引数のファイルがなければ処理を終わりにする if( !file_exists(base_path('MyUpdate/'.$filename)) ){ dd("ファイルが無いお(;_;)"); } // jsonファイルを解析する $json_data = file_get_contents(base_path('MyUpdate/'.$filename)); $result = json_decode($json_data); $this->info("before..."); //jsonのデータでテーブルからレコードを取得する。 $target = \DB::table($result->table) ->where($result->where,$result->conditions) ->first(); //取得したレコードを表示する var_dump($target); // jsonのデータでテーブルのレコードを更新する $query = \DB::table($result->table) ->where($result->where,$result->conditions) ->update([ $result->update => $result->value ]); $this->info("after..."); $target = \DB::table($result->table) ->where($result->where,$result->conditions) ->first(); var_dump($target); // 終えたらファイルを移動する // もしDoneフォルダがなければ作成する if( !file_exists(base_path('MyUpdate/Done')) ){ mkdir(base_path('MyUpdate/Done')); } // jsonファイルを移動する rename(base_path('MyUpdate/'.$filename),base_path('MyUpdate/Done/'.$filename)); $this->info("end update table command!"); }jsonの中身でテーブルを指定して
レコードの取得と更新を行います。処理が終わったらjsonファイルを移動させます。
base_pathメソッドは、プロジェクトルートの完全パスを返してくれる、ヘルパ関数です。
https://readouble.com/laravel/5.5/ja/helpers.html#method-base-pathこのコマンドには穴がありますが、その辺は置いといて実行したいと思います。
MyUpdateフォルダをプロジェクトルートに作成して
先ほどの中身と同じSample.jsonを作成します。作成したコマンドを実行します。
php artisan myupdate:table Sample.json start update table command! before... object(stdClass)#681 (4) { ["id"]=> int(1) ["name"]=> string(9) "横山緑" ["created_at"]=> string(19) "2019-10-15 10:07:53" ["updated_at"]=> string(19) "2019-10-15 10:07:53" } after... object(stdClass)#684 (4) { ["id"]=> int(1) ["name"]=> string(12) "高田健志" ["created_at"]=> string(19) "2019-10-15 10:07:53" ["updated_at"]=> string(19) "2019-10-15 10:07:53" } end update table command!コマンドを打つことで
jsonファイルを読み取って、レコードを検索して更新して、フォルダの作成とファイルの移動をする。という
なんとなーくコマンドっぽいのができました。
- 投稿日:2019-11-15T02:52:22+09:00
docker環境でお試しImageMagickをインストール
コンテナ立て直すと消えちゃいますッ………ドゥフフッッ………
dockerでOSを汚さずに試しにImageMagick使いたいな〜〜ってときに!
またはUbuntuにImageMagickインストールしたいときに!
コンテナたてるときにインストールしたいのであれば、下記記事を参考にしてください。
※dockerイメージphp:7.2-apacheの環境です><
https://qiita.com/saya1001kirinn/items/dacf5ef6b1d66ced846aUbuntu + Apatcheの環境です。
ImageMagickのインストール(パッケージマネージャを使ったインストール)
$ apt-get update $ apt-get install imagemagickPECLはPHP拡張モジュールのリポジトリとのことなので使えるとは思いますが、PHPが入ってなければ、または下記コマンド叩いて'command not found'がでたら
$ pecl help下記コマンドでpeclインストール
$ apt-get install php-pearこれでインターフェースであるImagckがインストール可能になる。
必要ないのもあるかもです…
・ライブラリ共通インターフェース
$ apt-get install gcc・Magick-Wand(ImageMagick C用のAPI)
$ apt-get install pkg-config・ImageMagick関連のライブラリインストール
$ apt-get install libmagickwand-devImagickのインストール(ImageMagickをインストールしてあることが前提)
$ pecl install imagickphp.ini にextension=imagick.so追加
※php.iniあるディレクトリ取得
php -i | grep php.ini※ディレクトリ先移動
cd /usr/local/etc/php※php.iniファイルがなければ作る
cp php.ini-development php.ini※vimインストールしてなければイントール
$ apt-get update $ apt-get install vimphp.ini のあるディレクトリで、vimでphp.iniを編集、extension=imagick.soを追加
vi php.iniextension=imagick.soi = 挿入(文字打てる)
:w = 内容保存
:q = 終了
esc = 文字打つのもうやめたい(インサートモードを終了し、コマンドモードに移行する)
:q! = わけわからんくなった辛い、とにかく終了したい(保存せず終了)終了後、catコマンドで追記できてるか確認
cat php.iniwebサーバ再起動
service apache2 reloadPDFから画像に変換するために必要なライブラリGhostScriptをインストール(必要であれば)
$ apt install ghostscriptcomposerにパッケージ追加
$ composer require spatie/pdf-to-image $ composer require spatie/pdf-to-text※バージョン確認やパッケージの種類は下記パッケージリストを確認してください。
https://packagist.org/packages/spatie/pdf-to-imagehttps://packagist.org/packages/spatie/pdf-to-image終わりッッッ!!!!
(念のため)インストールできているか確認
Imagick
$ imagick identify -versionImageMagick
$ convert -version
- 投稿日:2019-11-15T02:52:22+09:00
docker環境でお試しImageMagicをインストール
コンテナ立て直すと消えちゃいますッ………ドゥフフッッ………
dockerでOSを汚さずに試しにImageMagic使いたいな〜〜ってときに!
またはUbuntuにImageMagicインストールしたいときに!
コンテナたてるときにインストールしたいのであれば、下記記事を参考にしてください。
※dockerイメージphp:7.2-apacheの環境です><
https://qiita.com/saya1001kirinn/items/dacf5ef6b1d66ced846aUbuntu + Apatcheの環境です。
ImageMagickのインストール(パッケージマネージャを使ったインストール)
$apt-get update $apt-get install imagemagickPECLはPHP拡張モジュールのリポジトリとのことなので使えるとは思いますが、PHPが入ってなければ、または下記コマンド叩いて'command not found'がでたら
$pecl help下記コマンドでpeclインストール
$apt-get install php-pearこれでインターフェースであるImagckがインストール可能になる。
必要ないのもあるかもです…
・ライブラリ共通インターフェース
$apt-get install gcc・Magick-Wand(ImageMagick C用のAPI)
$apt-get install pkg-config・ImageMagick関連のライブラリインストール
$apt-get install libmagickwand-devImagickのインストール(ImageMagickをインストールしてあることが前提)
$pecl install imagickphp.ini にextension=imagick.so追加
※php.iniあるディレクトリ取得
php -i | grep php.ini※ディレクトリ先移動
cd /usr/local/etc/php※php.iniファイルがなければ作る
cp php.ini-development php.ini※vimインストールしてなければイントール
$apt-get update $apt-get install vimphp.ini のあるディレクトリで、vimでphp.iniを編集、extension=imagick.soを追加
vi php.iniextension=imagick.soi = 挿入(文字打てる)
:w = 内容保存
:q = 終了
esc = 文字打つのもうやめたい(インサートモードを終了し、コマンドモードに移行する)
:q! = わけわからんくなった辛い、とにかく終了したい(保存せず終了)終了後、catコマンドで追記できてるか確認
cat php.iniwebサーバ再起動
service apache2 reloadPDFから画像に変換するために必要なライブラリGhostScriptをインストール(必要であれば)
$apt install ghostscriptcomposerにパッケージ追加
$composer require spatie/pdf-to-image $composer require spatie/pdf-to-text※バージョン確認やパッケージの種類は下記パッケージリストを確認してください。
https://packagist.org/packages/spatie/pdf-to-imagehttps://packagist.org/packages/spatie/pdf-to-image終わりッッッ!!!!
(念のため)インストールできているか確認
Imagick
$imagick identify -versionImageMagick
$convert -version
- 投稿日:2019-11-15T01:26:06+09:00
dockerイメージphp:7.2-apacheでImageMagickをインストール
インストールのイメージ
ImagicをインストールするためのImageMagickのインストールが必要。
まずPHPへImageMagicのインストールを行い(※dockerfileへ記述)、その後、Imagicのライブラリをcomposerに追加する。インストール方法
php側でimagemagickとimagickのインストールが必要なため、dockerfileに下記を追加。
&& apt-get update && apt-get install -y imagemagick libmagickwand-dev \ && pecl install imagick \ && docker-php-ext-enable imagick \これでbuild後、docker-compose up -d !!!ッッッターーーーーン!!!!
Linux側で、下記コマンドを叩いてImagicのライブラリを追加。
$ composer require spatie/pdf-to-image $ composer require spatie/pdf-to-text※バージョン確認やパッケージの種類は下記パッケージリストを確認してください。
https://packagist.org/packages/spatie/pdf-to-imagehttps://packagist.org/packages/spatie/pdf-to-imageすると、composer.jsonのrequireに下記が追加されてる。
"spatie/pdf-to-image": "^1.8", "spatie/pdf-to-text": "^1.2"ImageMagickを使えるようになったか下記コマンドで確認
# convert -versionインストールできてたらこんなんがでるよ。
# convert -version Version: ImageMagick 6.9.7-4 Q16 x86_64 20170114 http://www.imagemagick.org Copyright: © 1999-2017 ImageMagick Studio LLC License: http://www.imagemagick.org/script/license.php Features: Cipher DPC Modules OpenMP Delegates (built-in): bzlib djvu fftw fontconfig freetype jbig jng jp2 jpeg lcms lqr ltdl lzma openexr pangocairo png tiff wmf x xml zlibちなみに、dockerfileに書いた
&& docker-php-ext-enable imagick \は、extensionを有効にするけん、 php.iniに extension=imagick.so を書く必要がなくなる!!!
書いてると重複するけん下記のエラーがでる。
PHP Warning: Module 'imagick' already loaded in Unknown on line 0以上です。
- 投稿日:2019-11-15T00:12:29+09:00
[備忘録]XAMPP の PHP の設定
php
の設定変更についてのメモ動作環境
Windows10 Home Edition XAMPP 7.2.17設定ファイルのパス
XAMPP
をD:\xampp
にインストールした場合、php
の設定ファイルはD:\xampp\php\php.ini
になる設定項目
タイムゾーン
デフォルトが
Europe/Berlin
なのでAsia/Tokyo
にする[Date] date.timezone=Asia/TokyoOPcache
デフォルトでは無効になっているので有効化する
下記をphp.ini
の最後に追記する[opcache] zend_extension=D:\xampp\php\ext\php_opcache.dll opcache.enable=1 opcache.enable_cli=1 opcache.memory_consumption=256 opcache.max_accelerated_files=10000
php.ini
の変更結果xampp\php\php.ini--- php.ini-origin Sat Apr 27 12:43:19 2019 +++ php.ini Tue Nov 12 23:58:56 2019 @@ -1952,7 +1952,7 @@ [Session] define_syslog_variables=Off [Date] -date.timezone=Europe/Berlin +date.timezone=Asia/Tokyo [MySQL] mysql.allow_local_infile=On mysql.allow_persistent=On @@ -1977,3 +1977,9 @@ mssql.min_message_severity=10 mssql.compatability_mode=Off mssql.secure_connection=Off +[opcache] +zend_extension=D:\xampp\php\ext\php_opcache.dll +opcache.enable=1 +opcache.enable_cli=1 +opcache.memory_consumption=256 +opcache.max_accelerated_files=10000参考