20191115のPHPに関する記事は15件です。

Wordpress5.3で勝手に画像が縮小されるのを防止!

ええっ

なんてことを. 自慢の4K画像を上げたら突然縮小されるようになってしまった?

解決法

wp-admin/includes/image.php の243行目にある

$threshold = (int) apply_filters( 'big_image_size_threshold', 2560, $imagesize, $file, $attachment_id );

をコメントアウトしましょう. これで縮小されないはず?


https://make.wordpress.org/core/2019/10/11/updates-to-image-processing-in-wordpress-5-3/#comment-37136

https://core.trac.wordpress.org/browser/trunk/src/wp-admin/includes/image.php?rev=46565#L226

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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()を書いておいてください)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel5.8】複数のデータベースに接続するときは全てのモデルに`$connection`を書こう

先日のEagerロード先テーブルは必ず主キーもSELECTしないといけないって記事を見るとわかりますが、Eagerロードでは複数テーブルを結合するのにJOINを使わず、データを別々に取ってきて後から合体させています。

つまり、これは異なるデータベースのテーブルに疑似リレーションを張れるのでは?

テーブルA
class TableA extends Model{
    // テーブル名
    protected $table = 'table_a';

    /**
     * リレーション
     * @return BelongsTo
     */
    public function tableb()
    {
        return $this->belongsTo(TableB::class, 'b_id', 'id');
    }
}
別DBのテーブルB
class 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を書いておくと安全かもしれない。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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!

類似記事

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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. 上司ありがとう。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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作成予定です。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

学習のアウトプット #1

はじめに

なぜQiitaでの投稿を始めたかというと、現在PHP/Laravel絶賛勉強中なのですが教材を見てコードを書いてるばかりで全然アウトプットしておらず、学習のしたことがイマイチ身についてないなぁと感じたからです。

早速アウトプットしていこうと思うのですが、今回はOSについて書こうと思います。

ある時プログラミングを学習していて、OSって言葉が目に付いて「あれ、OSってなんだっけ??」と思ったためです。

OSとは

OSとはオペレーティングシステムの略で、PCを管理・操作するシステムです。
よく聞くのはwindows,macOS,linuxだったり、スマホのiOSやAndroidもOSです。

OSがないとPCは動きません。
昔のゲームに例えるとゲーム機本体があってもソフトがないからゲームできないみたいな感じですかね。

OSの機能

  • 入出力の制御
    キーボードをどのキーを何回押したか、マウスをどの方向にどれだけ動かしたか、などのキーボードやマウスの入出力の制御やモニターの画面表示の機能はOSが担っています。

この機能によって画面にエディタが表示され、コードを書くことができ、カーソルを動かすことができるわけです。

  • ファイル管理 フォルダやファイルの管理もOSの役割です。

この機能のおかげで、コードを書いたファイルをフォルダに入れたり出したり、保存や表示することができます。

  • タスク管理
    ブラウザでググりながらエディタでコードを書いていく、というように複数のアプリを表示させたり、アプリの起動や終了等の管理・制御もOSの機能です。

  • その他にも様々な機能
    上記以外にもマウスやキーボード、外付けのハードディスクなどのハードウェアの管理などPCの基本的な部分はOSが担っています。

さいごに

とまぁこんな感じで学習のアウトプットとして投稿を続けていけたらと思っています。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

docker-composeで簡単に環境構築Apache2.4+PHP7.1+PostgreSQL9.6

仕事で上記の環境が必要になったのでもうやりたくない備忘録として残す

環境

  • Mac for Docker
  • Apache2.4
  • PHP7.1
  • PostgreSQL9.6

構成

ディレクトリ構成はこんな感じです。

スクリーンショット 2019-11-15 16.19.43.png

Dockerfile

docker/webDockerfile という名前のファイルを作成し以下の内容で記述

PHPのバージョンを変えたければFROMの php:7.3-apache という風に変えればいけるはず。

docker/web/Dockerfile
FROM 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 = auto

docker-compose.yml

PostgreSQLのバージョン変えたければ image: postgres:9.3 の部分を変更してください。
またはポートを変えたいときは ports: -8110:80 を変更してください。

docker-compose.yml
version: '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

下の画面が表示されていれば成功

スクリーンショット 2019-11-15 16.39.00.png

マシン接続

コンテナ内に入ってみる

$ docker exec -it test_web_1 bash

# ls
# docker  docker-compose.yml  index.php

最後に

docker-compose.ymlが便利すぎて辛い。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

phpのmb_strimwidth

convenient build-in function

テキストデータを一定の文字数で[...]したい時に便利。
こういうのがあるのは知りませんでした。
勉強不足ですね。

    $text = "春はあけぼの。やうやう(ようよう)白くなりゆく山ぎは(やまぎわ)、少し明(あ)かりて、紫(むらさき)だちたる雲の細くたなびきたる。 春は、明け方(あけがた)が良い。 だんだん、白くなっていく山ぎわが、 少し明るくなって、紫がかった雲が、細くたなびいているのが、";

    echo mb_strimwidth($text,0,120,"...","UTF-8");

//春はあけぼの。やうやう(ようよう)白くなりゆく山ぎは(やまぎわ)、少し明(あ)かりて、紫(むらさき)だちたる雲の細く...

http://php.net/manual/en/function.mb-strimwidth.php

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

mb_strimwidth in PHP

convenient build-in function

テキストデータを一定の文字数で[...]したい時に便利。
こういうのがあるのは知りませんでした。
勉強不足ですね。

    $text = "春はあけぼの。やうやう(ようよう)白くなりゆく山ぎは(やまぎわ)、少し明(あ)かりて、紫(むらさき)だちたる雲の細くたなびきたる。 春は、明け方(あけがた)が良い。 だんだん、白くなっていく山ぎわが、 少し明るくなって、紫がかった雲が、細くたなびいているのが、";

    echo mb_strimwidth($text,0,120,"...","UTF-8");

//春はあけぼの。やうやう(ようよう)白くなりゆく山ぎは(やまぎわ)、少し明(あ)かりて、紫(むらさき)だちたる雲の細く...

http://php.net/manual/en/function.mb-strimwidth.php

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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ファイルを読み取って、レコードを検索して更新して、フォルダの作成とファイルの移動をする。という
なんとなーくコマンドっぽいのができました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

docker環境でお試しImageMagickをインストール

コンテナ立て直すと消えちゃいますッ………ドゥフフッッ………

dockerでOSを汚さずに試しにImageMagick使いたいな〜〜ってときに!
またはUbuntuにImageMagickインストールしたいときに!
コンテナたてるときにインストールしたいのであれば、下記記事を参考にしてください。
※dockerイメージphp:7.2-apacheの環境です><
https://qiita.com/saya1001kirinn/items/dacf5ef6b1d66ced846a

Ubuntu + Apatcheの環境です。

ImageMagickのインストール(パッケージマネージャを使ったインストール)

$ apt-get update
$ apt-get install imagemagick

PECLは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-dev

Imagickのインストール(ImageMagickをインストールしてあることが前提)

$ pecl install imagick

php.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 vim

php.ini のあるディレクトリで、vimでphp.iniを編集、extension=imagick.soを追加

vi php.ini
extension=imagick.so

i = 挿入(文字打てる)
:w = 内容保存
:q = 終了
esc = 文字打つのもうやめたい(インサートモードを終了し、コマンドモードに移行する)
:q! = わけわからんくなった辛い、とにかく終了したい(保存せず終了)

終了後、catコマンドで追記できてるか確認

cat php.ini

webサーバ再起動

service apache2 reload

PDFから画像に変換するために必要なライブラリGhostScriptをインストール(必要であれば)

$ apt install ghostscript

composerにパッケージ追加

$ 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 -version

ImageMagick

$ convert -version
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

docker環境でお試しImageMagicをインストール

コンテナ立て直すと消えちゃいますッ………ドゥフフッッ………

dockerでOSを汚さずに試しにImageMagic使いたいな〜〜ってときに!
またはUbuntuにImageMagicインストールしたいときに!
コンテナたてるときにインストールしたいのであれば、下記記事を参考にしてください。
※dockerイメージphp:7.2-apacheの環境です><
https://qiita.com/saya1001kirinn/items/dacf5ef6b1d66ced846a

Ubuntu + Apatcheの環境です。

ImageMagickのインストール(パッケージマネージャを使ったインストール)

$apt-get update
$apt-get install imagemagick

PECLは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-dev

Imagickのインストール(ImageMagickをインストールしてあることが前提)

$pecl install imagick

php.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 vim

php.ini のあるディレクトリで、vimでphp.iniを編集、extension=imagick.soを追加

vi php.ini
extension=imagick.so

i = 挿入(文字打てる)
:w = 内容保存
:q = 終了
esc = 文字打つのもうやめたい(インサートモードを終了し、コマンドモードに移行する)
:q! = わけわからんくなった辛い、とにかく終了したい(保存せず終了)

終了後、catコマンドで追記できてるか確認

cat php.ini

webサーバ再起動

service apache2 reload

PDFから画像に変換するために必要なライブラリGhostScriptをインストール(必要であれば)

$apt install ghostscript

composerにパッケージ追加

$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 -version

ImageMagick

$convert -version
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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

以上です。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[備忘録]XAMPP の PHP の設定

php の設定変更についてのメモ

動作環境

Windows10 Home Edition
XAMPP 7.2.17

設定ファイルのパス

XAMPPD:\xampp にインストールした場合、 php の設定ファイルは D:\xampp\php\php.ini になる

設定項目

タイムゾーン

デフォルトが Europe/Berlin なので Asia/Tokyo にする

 [Date]
date.timezone=Asia/Tokyo

OPcache

デフォルトでは無効になっているので有効化する

下記を 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

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む