コマンド実行

Posted by muchag | PHP | 2018-05-18 (金) 23:53:31

php からサーバコマンドを実行する方法。

公式:execsystem

概要

php からサーバコマンドを実行するには
exec と system の2つの関数が用意されている。

二者の違いは、出力を返すか返さないかみたいだけど
引数指定次第でどちらも出力を返すみたいなので
結果的には、同じ働きなのかしらね~。

書式
exec

string exec ( string $command [, array &$output [, int &$return_var ]] )

第1引数:コマンド文字列
第2引数:出力格納用変数。省略可。省略すると出力を受け取れない
第3引数:コマンド実行結果ステータス格納用変数。省略可。省略するとステータスを受け取れない

system

string system ( string $command [, int &$return_var ] )

第1引数:コマンド文字列
第2引数:コマンド実行結果ステータス格納用変数。省略可。省略するとステータスを受け取れない

非同期処理

どちらもコマンド文字列に「 > /dev/null &」と付記してやることで、非同期に処理を実行できる。

注意:

プログラムがこの関数で始まる場合、 バックグラウンドで処理を続けさせるには、
プログラムの出力をファイルや別の出力ストリームにリダイレクトする必要があります。
そうしないと、プログラムが実行を終えるまで PHP はハングしてしまいます。

どうやら、上記付記内容は、出力をリダイレクトさせるものらしい。

参考サイト

SAMURAI:【PHP入門】外部コマンドの実行(exec)とコマンドライン実行の方法(2017-10-16)

PHP | 2018-05-18 (金) 23:53:31 |

phpDocumentor

Posted by muchag | PHP | 2018-04-11 (水) 15:52:58

個人で開発をしていると、こういうチームワーク的な手法に手が回らない。
実感が湧かないからね。。。

公式?:phpDocumentor

アノテーション
@property

公式?:@property
メンバ変数の型宣言をできる。

php では、メンバ変数を宣言する際に、型宣言を伴わない。
そのせいで phpStrom では、警告が出るらしい。

User.php

class User
{
    private $name;

    public function getName()
    {
        return $this->name;
    }

    public function setName($name)
    {
        $this->name = $name;
    }
}

この User クラスをメンバ変数 $leader へ代入すると
$leader が何者か不明なために、User クラス内メソッドを利用する際に警告となるらしい。

そこで、下記のように @property アノテーションで定義してやることで
理解してもらえるそうな。

ちなみに、複数管理するメンバ変数には、User[] という他言語タイプで伝えるとよいらしい。


/**
 * Class Group
 *
 * @property User $leader
 * @property User[] $leaders <- array ではなく User[]
 */
class Group
{
    private $leader;
    private $leaders = [];
}
@method

公式?:@method
findX のようなマジックメソッド利用時に用いる。
※マジックメソッドは、そんなメソッドは存在しないんだけど
メソッド名からフレームワーク側が解析して、処理してくれるメソッド?


/**
 * Class SampleModel
 *
 * @method array findById($id, $fields = null)
 */
class SampleModel extends AppModel
{

このように明記してやることができる。

@uses, @used-by

メソッド名を動的に生成する場合に用いる。
要は、当該メソッドがどこからも呼ばれていないと思われるのを避ける。

公式?:@uses & @used-by


class Hoge
{
    /**
     * @uses addUser(), addAdmin()
     */
    public function addMember($user, $user_type)
    {
        $method = sprintf('add%s', $user_type);
        $this->{$method}($user); // $user_type に合ったメソッドを呼ぶ
    }

    /**
     * @used-by addMember
     */
    private function addUser($user)
    {
    }

    /**
     * @used-by addMember
     */
    private function addAdmin($user)
    {
    }
}
@uses

@uses の呼び出し元に設定する。

@used-by

@uses の呼び出し先に設定する。

参考サイト

バシャログ。:PhpStorm の静的解析機能をさらに活用するための3つのアノテーション(2015-12-07)
→@property, @method, @uses について非常にわかりやすかった

PHP | 2018-04-11 (水) 15:52:58 |

editorconfig-eclipse

Posted by muchag | CakePHP 3.x,Eclipse,Library & PlugIn & AddIn | 2018-03-07 (水) 16:21:41

.editorconfig に対応するためのプラグイン。

CakePHP3 の コーディング規約 を調べていたら
.editorconfig なるものの存在を知った。

これを Eclipse で利用できるようになるプラグイン。

【環境】
editorconfig-eclipse: 0.3.0.201702161018 Beta
Eclipse:Oxygen (4.7)
EPP Marketplace Client:1.5.1.v20160929-1432
OS:Windows10 Pro 64bit
インストール

[ヘルプ]-[Eclipse マーケットプレース]
検索窓に「editorconfig」
「editorconfig-eclipse 0.x」がヒットするので [インストール]
ライセンスに同意して [完了]

警告:署名なしコンテンツを含むソフトウェアをインストールしています。
このソフトウェアの真正性または妥当性を実証できません。
インストールを続行しますか?

がーん。。。断念。 😥

CakePHP 3.x,Eclipse,Library & PlugIn & AddIn | 2018-03-07 (水) 16:21:41 |

CakePHP3

Posted by muchag | CakePHP 3.x,CentOS,さくらインターネット | 2018-01-18 (木) 19:37:55

【環境】
CakePHP: 3.5.8
php: 7.1.13
CentOS: 7.4.1708
さくらインターネット:VPS 2G プラン
ディレクトリ作成

後述するけど、Composer は root では使わない方がよいそうなので
一般ユーザで操作。

そのため、先にroot でディレクトリを作成して
パーミッションを設定しておく必要がある。


mkdir /var/www/my_app
cd /var/www
chown apache:[username] my_app
chmod 775 my_app
  1. ディレクトリ作成
  2. ディレクトリ移動
  3. 所有者変更
  4. パーミッションを設定
インストール

一般ユーザへ変更してから。


composer create-project --prefer-dist cakephp/app /var/www/my_app

アプリ名を指定せず、下記のように実行すると


composer create-project --prefer-dist cakephp/app

app ディレクトリが自動生成されて、その中にインストールされる。

試行錯誤
インストール警告

root でインストールをしようとすると、下記警告が出る。


composer create-project --prefer-dist cakephp/app /var/www/my_app
Do not run Composer as root/super user! See https://getcomposer.org/root for details
インストール例外

上記コマンドにてインストールをしようとしたところ
下記例外が投げられた。

[Composer\Downloader\TransportException]
The “https://packagist.org/p/provider-latest%240cbfb40ab72a881d21b70f78286d39cd72e3b0eb8704c13e79dc49624e549973.json” file could not be downloaded (HTTP/1.1 404 Not Found)
対応1

Google 先生に質問し、1つ目の対応。
下記参考サイトによると、composer の健康診断コマンドらしい。

参考サイトの内容とは異なるけど、まずは診断。


composer diag
Checking platform settings: OK
Checking git settings: OK
Checking http connectivity to packagist: OK
Checking https connectivity to packagist: OK
Checking github.com rate limit: OK
Checking disk free space: OK
Checking pubkeys:
Tags Public Key Fingerprint: 57815BA2 7E54DC31 7ECC7CC5 573090D0  87719BA6 8F3BB723 4E5D42D0 84A14642
Dev Public Key Fingerprint: 4AC45767 E5EC2265 2F0C1167 CBBB8A2B  0C708369 153E328C AD90147D AFE50952
OK
Checking composer version: OK
Composer version: 1.6.2
PHP version: 7.1.13
PHP binary path: /usr/bin/php

問題ないみたい。

参考サイト

ふたりはララベル:Composerのエラーの原因を調査する(2014-08-23)

対応2

下記参考サイトを見つけて、わけもわからないまま対応。


wget http://curl.haxx.se/ca/cacert.pem
cp -v -f cacert.pem /etc/pki/tls/certs/ca-bundle-curl.crt
  1. OpenSSL(正確にはcurl)で使用するCAをダウンロード
  2. 当該ファイルを、本家(?)ca-bundle.crt の存在するディレクトリへコピー

注意事項

このcrtファイルはcurlのエラーを回避するためのものですので、本来のca-bundle.crtを上書きしないように注意して下さい。

Qiita:ComposerからLaravelを導入しようとしてOpenSSL周りのエラーで困った件(2015-06-23)

php.ini へ上記ファイルを設定


vim /etc/php.ini

curl.cainfo=/etc/pki/tls/certs/ca-bundle-curl.crt
openssl.cafile=/etc/pki/tls/certs/ca-bundle-curl.crt
ファイルパス

最初コピペで作業をして、下記のように怒られた。


cp -v -f cacert.pem /full/path/to/certs/ca-bundle-curl.crt
`cacert.pem' -> `/full/path/to/certs/ca-bundle-curl.crt'
cp: 通常ファイル `/full/path/to/certs/ca-bundle-curl.crt' を作成できません: そのようなファイルやディレクトリはありません

そりゃ、/full/path/to は見つからなくて怒られるよねw

でも、コピー先のディレクトリがわからなかったので、
注意書きに書かれていた ca-bundle.crt ファイルを検索。


find / -name 'ca-bundle.crt'
/etc/pki/tls/certs/ca-bundle.crt
参考サイト

Qiita:ComposerからLaravelを導入しようとしてOpenSSL周りのエラーで困った件(2015-06-23)

解決

上記「対応2」で解決!
ありがたや~。

CakePHP 3.x,CentOS,さくらインターネット | 2018-01-18 (木) 19:37:55 |

さくら VPS -> Composer

Posted by muchag | Library & PlugIn & AddIn,PHP,さくらインターネット | 2018-01-16 (火) 22:41:44

【環境】
Composer: 1.6.2
php: 7.1.13
CentOS: 7.4.1708
さくらインターネット:VPS 2G プラン
インストール

curl -sS https://getcomposer.org/installer | php
All settings correct for using Composer
Downloading...

Composer (version 1.6.2) successfully installed to: /root/composer.phar
Use it: php composer.phar
起動

php composer.phar
Do not run Composer as root/super user! See https://getcomposer.org/root for details
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 1.6.2 2018-01-05 15:28:41

Usage:
  command [options] [arguments]

Options:
  -h, --help                     Display this help message
  -q, --quiet                    Do not output any message
  -V, --version                  Display this application version
      --ansi                     Force ANSI output
      --no-ansi                  Disable ANSI output
  -n, --no-interaction           Do not ask any interactive question
      --profile                  Display timing and memory usage information
      --no-plugins               Whether to disable plugins.
  -d, --working-dir=WORKING-DIR  If specified, use the given directory as working directory.
  -v|vv|vvv, --verbose           Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

Available commands:
  about                Shows the short information about Composer.
  archive              Creates an archive of this composer package.
  browse               Opens the package's repository URL or homepage in your browser.
  check-platform-reqs  Check that platform requirements are satisfied.
  clear-cache          Clears composer's internal package cache.
  clearcache           Clears composer's internal package cache.
  config               Sets config options.
  create-project       Creates new project from a package into given directory.
  depends              Shows which packages cause the given package to be installed.
  diagnose             Diagnoses the system to identify common errors.
  dump-autoload        Dumps the autoloader.
  dumpautoload         Dumps the autoloader.
  exec                 Executes a vendored binary/script.
  global               Allows running commands in the global composer dir ($COMPOSER_HOME).
  help                 Displays help for a command
  home                 Opens the package's repository URL or homepage in your browser.
  info                 Shows information about packages.
  init                 Creates a basic composer.json file in current directory.
  install              Installs the project dependencies from the composer.lock file if present, or falls back on the composer.json.
  licenses             Shows information about licenses of dependencies.
  list                 Lists commands
  outdated             Shows a list of installed packages that have updates available, including their latest version.
  prohibits            Shows which packages prevent the given package from being installed.
  remove               Removes a package from the require or require-dev.
  require              Adds required packages to your composer.json and installs them.
  run-script           Runs the scripts defined in composer.json.
  search               Searches for packages.
  self-update          Updates composer.phar to the latest version.
  selfupdate           Updates composer.phar to the latest version.
  show                 Shows information about packages.
  status               Shows a list of locally modified packages.
  suggests             Shows package suggestions.
  update               Upgrades your dependencies to the latest version according to composer.json, and updates the composer.lock file.
  upgrade              Upgrades your dependencies to the latest version according to composer.json, and updates the composer.lock file.
  validate             Validates a composer.json and composer.lock.
  why                  Shows which packages cause the given package to be installed.
  why-not              Shows which packages prevent the given package from being installed.
実行ファイルの移動

mv composer.phar /usr/local/bin/composer

これで、直接 composer で利用できる。

おまけ
インストール時警告

実は上記インストール時に、下記2行目の警告が出ていた。


curl -sS https://getcomposer.org/installer | php
PHP Warning:  Module 'intl' already loaded in Unknown on line 0
All settings correct for using Composer
Downloading...

Composer (version 1.6.2) successfully installed to: /root/composer.phar
Use it: php composer.phar

これは、php.ini で extension=intl.so をコメントアウトすることで消えたけど
CakePHP3 をインストールする際に intl は必要なはずなので、後ほど試す。

起動時警告

実は上記起動時に、下記2行目の警告が出ていた。


php composer.phar
Do not run Composer as root/super user! See https://getcomposer.org/root for details

あら、Composer って、root で利用してはいけないのね~。

実行ファイルを移動させて、一般ユーザに戻って利用したら
上記警告は出なくなった。

ちなみに、インストールを root でしたせいか
実行ファイルを移動しておかないと、php composer.phar では、実行できず


php composer.phar
Could not open input file: composer.phar

このように怒られた。。。

参考サイト

WinRoad徒然草:さくらのVPSサーバーにLaravelのインストール(2015-03-23)

結果セット整形

Posted by muchag | Symfony 1.x | 2016-11-19 (土) 12:04:24

DQL における、結果セットの整形。
Data Hydrators

【環境】
Symfony:1.4.13
doctrine:1.2.4
書式

execute, fetchOne, fetchAll などの第2引数に指定する。

  1. $q = Doctrine_Core::getTable('User')
  2.     ->createQuery('u')
  3.     ->leftJoin('u.Email e')
  4.     ->where('u.username = ?', 'jwage');
  5.  
  6. $user = $q->fetchOne(array(), Doctrine_Core::HYDRATE_RECORD);
詳細
HYDRATE_RECORD

レコードをオブジェクトとして取得。
デフォルト値なので、省略すればこれになる。

HYDRATE_ARRAY

連想配列として取得。

HYDRATE_SCALAR

連想配列として取得。
キーが、カラム名_フィールド名 という書式になっている。

HYDRATE_SINGLE_SCALAR

配列として取得。
WHERE 句で指定したカラムの値を、
添え字 0 から始まる配列の要素に格納(しているように見える)。

HYDRATE_ON_DEMAND

公式サイトを読む限り、
「1レコードしか読み込まないのでメモリを節約できるよ」
って書いてある気がするけど
実験したら、時間制限に引っ掛かって戻ってこなかったので
今回はパス。

HYDRATE_RECORD_HIERARCHY

nested ビヘイビアを利用しているときに使える引数っぽい。
オブジェクトとして取得。

HYDRATE_ARRAY_HIERARCHY

nested ビヘイビアを利用しているときに使える引数っぽい。
連想配列として取得。

HYDRATE_NONE

配列として取得。
取得してきたデータを、添え字 0 から始まる配列の要素に格納(しているように見える)。

HYDRATE_ARRAY_SHALLOW

連想配列として取得。
SELECT で指定したカラムだけを取得。

※下2つは、下記参考サイトから拾ってきた。
公式サイトに全種類が載っていないのは不思議・・・

HYDRATE_RECORD_SHALLOW

上記定数を参考に、こんなのもあるかと思ったけどなかったw

参考サイト

stackoverflow:Select One column Doctrine DQL(2013-01-19)

Symfony 1.x | 2016-11-19 (土) 12:04:24 |

ヒアドキュメント

Posted by muchag | PHP | 2016-01-16 (土) 10:53:42

なが~い文字列を扱うための構文。

PHP Manual:文字列 ヒアドキュメント

【環境】
PHP:5.4.7
注意

WordPress なのか iG:Syntax Hiliter なのか
<<< という記述をすると、表示が乱れるので <<< と表記してある。 でも、最後のコード表記は大丈夫なのよね~・・・。

書式
  1. &lt;&lt;&lt;EOD
  2. hogehoge
  3. EOD
  4. ;
  5.  
  6. // PHP 5.3.0 以降、開始 ID をダブルクォーテーションで囲めるように。
  7. // Nowdoc との違いを明示するのが目的?
  8. &lt;&lt;&lt;"EOM"
  9. hogehoge
  10. EOM
  11. ;
ID

ヒアドキュメントを識別するためのもの。
上記例では、EOD が該当する。

ルール
  • 英数字およびアンダースコアのみ
  • 数字でない文字またはアンダースコアで始まる必要がある
  • 終端 ID がある行には、セミコロン (;) 以外の他の文字が含まれていてはならない
  • ID はインデントしてはならない
  • セミコロンの前に空白やタブを付けてはいけない
  • 終端 ID の前の最初の文字は、使用するオペレーティングシステムで定義された 改行である必要がある
  • 最後の区切り文字の後にもまた、改行を入れる必要がある
;(セミコロン)
  1. $foo = &lt;&lt;&lt;EOD
  2. hogehoge
  3. EOD;

よく上記のようなスクリプトを見かけるけど
最後の ;(セミコロン)は、あくまでも $foo = に対するものであって
ヒアドキュメントとは関係ない。

つまり、下記のように記述すればイメージしやすい。

  1. $foo = &lt;&lt;&lt;EOD
  2. hogehoge
  3. EOD
  4. ;
文字列部

変数は、そのまま記述すればパースされる。

  1. echo &lt;&lt;&lt;EOT
  2. My name is "$name". I am printing some $foo->foo.
  3. Now, I am printing some {$foo->bar[1]}.
  4. This should print a capital 'A': \x41
  5. EOT;
  6.  
  7. // 出力結果
  8. My name is "MyName". I am printing some Foo.
  9. Now, I am printing some Bar2.
  10. This should print a capital 'A': A

PHP Manual:文字列 変数のパース
これを読んでも、「簡単」と「複雑」の定義がはっきりしないので
全て {}(波括弧、中括弧)を付けるほうが安全かも?

定数や関数

定数や関数は $(ドル)から始まらないので、処理不能・・・?

最初に Google 先生に質問したら、
「定数や関数は使えない」という回答ばっかり引っかかってきたけど
2回目の質問では、アッサリと解決策が。
Blog:PHPのヒアドキュメント内で定数や関数を動かす
Web、ときどきDTP。(うぇヴ(web)屋のネタ帳。):PHPのヒアドキュメント内で関数を使う。計算もしたい。

クラス

クラスを用意して、そのメンバ変数やメソッドとして利用する。

可変変数

定数は、そのまま変数にしてしまえばよい。
関数は、可変変数を用いて処理。

利用

直接出力しても

  1. echo &lt;&lt;&lt;EOD
  2. hogehoge
  3. EOD;

変数に代入してもよい。

  1. $foo = &lt;&lt;&lt;EOD
  2. hogehoge
  3. EOD;
Nowdoc

PHP 5.3.0 以降の機能。

ヒアドキュメントはダブルクォーテーションで括られた文字列として扱われるのに対して
Nowdoc は、シングルクォーテーションで括られた文字列として扱われる。

中身について、パース処理を行わないので、エスケープをする必要がなくなる。
SGML の

書式

開始 ID を、シングルクォーテーションで括る。

  1. &lt;&lt;&lt;'EOD'
  2. hogehoge
  3. EOD
  1. echo <<<'EOT'
  2. My name is "$name". I am printing some $foo->foo.
  3. Now, I am printing some {$foo->bar[1]}.
  4. This should not print a capital 'A': \x41
  5. EOT;
  6.  
  7. // 出力結果
  8. My name is "$name". I am printing some $foo->foo.
  9. Now, I am printing some {$foo->bar[1]}.
  10. This should not print a capital 'A': \x41
参考サイト

すたら日記:PHP ヒアドキュメントの使い方:2通り

PHP | 2016-01-16 (土) 10:53:42 |

array_column

Posted by muchag | PHP | 2016-01-13 (水) 21:51:59

array_column は、連想配列群の中から、単一カラムを取り出して配列で返してくれる。

【環境】
PHP: 5.4.7
内容

レコードセットのように、同型の連想配列が連番で格納されているような配列において
各レコードから特定のカラムの値だけを抽出する。

書式

array array_column ( array $input , mixed $column_key [, mixed $index_key = null ] )

php:array_column

第1引数:元配列
第2引数:抽出したいカラム名
第3引数:抽出後キーにしたいカラム名。省略可

  1. $users = Array(
  2.     0 => Array(
  3.         'id' => 'user001',
  4.         'name' => 'tanaka',
  5.     },
  6.     1 => Array(
  7.         'id' => 'user002',
  8.         'name' => 'suzuki',
  9.     },
  10.     2 => Array(
  11.         'id' => 'user003',
  12.         'name' => 'yamada',
  13.     },
  14. );
  15.  
  16. $names = array_column($users, 'name');
  17. print_r($names);
  18.  
  19. // 出力結果
  20. Array(
  21.     0 => 'tanaka',
  22.     1 => 'suzuki',
  23.     2 => 'yamada',
  24. );
  25.  
  26. $names = array_column($users, 'name', 'id');
  27. print_r($names);
  28.  
  29. // 出力結果
  30. Array(
  31.     'user001' => 'tanaka',
  32.     'user002' => 'suzuki',
  33.     'user003' => 'yamada',
  34. );
あれ?

PHP 5.5 から新しく加わった関数。

残念!
私は 5.4.7 だった><

代替

がっかりポンだ~と思っていたら
代替というか、GitHub:array_column/src/array_column.php で関数が提供されていた。
ありがとうございます!

ファイルに保存して、インクルードパスへ配置して
require して、見事動作しました♪

PHP | 2016-01-13 (水) 21:51:59 |

Doctrine -> DISTINCT, LEFT JOIN

Posted by muchag | Symfony 1.x | 2015-12-22 (火) 16:19:36

注意書きを見つけたのでメモ。

【環境】
OpenPNE:3.8.15
Symfony:1.4.13
doctrine:1.2.4
参考サイト

Qiita:DoctrineのDISTINCTは正しく動作しない
→回避策あり

Qiita:DoctrineのLEFT JOINはまともに使えない
→回避策あり

Symfony 1.x | 2015-12-22 (火) 16:19:36 |

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry ‘hoge’ for key ‘PRIMARY’

Posted by muchag | Symfony 1.x | 2015-11-17 (火) 17:52:00

【環境】
Symfony:1.4.13
doctrine:1.2.4
状況

既存データの更新をしようとして起きた。

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry ‘hoge’ for key ‘PRIMARY’

ちょこっといじったら、エラー内容が下記に変わったけど、エラー内容はほぼ同じ?

SQLSTATE[23000]: Integrity constraint violation: 1557 Upholding foreign key constraints for table ‘op_category’, entry ”, key 1 would lead to a duplicate entry
原因

既存データとセーブデータの ID(プライマリーキー)が被ってるよ、という警告のまんま。

経緯

フォームを利用しているものの、Ajax 通信であったため、フォームをそのまま突っ込むのではなく
手動でデータをセットして保存しようとしていた。

Symfony(Doctrine)では、save メソッドで、INSERT と UPDATE を自動判別してくれるとのことで
INSERT のときと、同じデータのセットの仕方にしていたけど
これがいけなかったみたい。

解決

後述の通り、事前にフォームにデフォルト値を設定することで
エラーは消えた。

INSERT と UPDATE を自動判別

フォーム -> 表示(Model 有り) にあるように

  1. $sample = Doctrine::getTable('Sample')->find($request->getParameter('id'));
  2. $this->form = new MySampleForm($sample);

とすることで、フォームのデフォルト値(既存データ)がセットされ
これによって、INSERT と UPDATE を自動判別しているっぽい。

Symfony 1.x | 2015-11-17 (火) 17:52:00 |
次ページへ »