カテゴリー別アーカイブ: PHP

CakePHP をインストールしてみたら諸々エラー

いろいろなフレームワークを使ってみるべく CakePHP をインストールして試してみようとしたところ、まぁ諸々エラーが出ましたので書いておきます。

公式サイトのインストール説明の通りにインストールを進めていき

./bin/cake server
を実行したら
You must enable the intl extension to use CakePHP.
というエラーが出ました。
そうですね、インストールのときにも何かメッセージが出ていた気がします。
(そのままほっておいて突き進んでみたのですが、やっぱりだめですか)

yum install –enablerepo=remi-php56 php-intl

で intl インストールして再度

./bin/cake server

PHP Fatal error: require(): Failed opening required ‘/xxxx/vendor/autoload.php’

なんでしょう。。。

ファイルが無いようです。。

これは intl とは別な現象でしょうか

CakePHPがインストールされたディレクトリを削除してもう一度インストールしてみる
composer create-project –prefer-dist cakephp/app cake_test

proc_open(): fork failed – Cannot allocate memory

あらら、メモリが足りないと。。

さすがに AWS EC2 nano インスタンスだと、そのままのメモリでは厳しいようですね。

以下のコマンドでスワップファイルを作成して、見かけ上のメモリを増やしてみる。
/bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
/sbin/mkswap /var/swap.1
/sbin/swapon /var/swap.1

ふたたびディレクトリを削除して
composer create-project –prefer-dist cakephp/app cake_test

おぉ、無事インストール成功。気を取り直して

./bin/cake server

を実行

Welcome to CakePHP v3.6.7 Console
—————————————————————
App : src
Path: /data/cake_test/src/
DocumentRoot: /data/cake_test/webroot
Ini Path:
—————————————————————
built-in server is running in http://localhost:8765/
You can exit with `CTRL-C`

あぁ、やっと動きました!

EC2上なので、 localhost のところをグローバルIPに変えてアクセス。

http://xxx.xxx.xxx.xxx:8765/

ファイヤーウォールに引っかかってタイムアウト。。。

EC2 の SecurityGroup の 8765ポートに風穴を開ける

アクセスしてみる

タイムアウト。。。。

それならIP指定で起動してみる
bin/cake server -H xxx.xxx.xxx.xxx -p 8765

Failed to listen on xxx.xxx.xxx.xxx:8765 (reason: Cannot assign requested address)

うぅ、グローバルIPでは起動できないようです

面倒なので Apache の定義を追加してアクセスしました。

無事にトップページが表示されました。

phpMyAdmin でテーブル一覧がページングされるのを解除する

最近のバージョンの PHPMyAdmin は左側のフレームに表示されるテーブル一覧がページングされるようになった。

テーブルを選択する際にいちいちページを切り替えて探さないといけないので、自分にとっては何のメリットも無いどころか、かなり使いにくくなってしまった。

しばらくそのままで使っていたが、我慢の限界で、ページングしないようにできないものか設定をいじってみたら、ページングを解除できた。

vi config.inc.php で以下を追加する

$cfg[‘MaxNavigationItems’] = 100;
$cfg[‘MaxTableList’] = 100;

ログアウトしてログインしなおせば、ページングされずに1画面で表示されるようになった。

テーブルが100個以上ある場合は数字をもっと大きくすれば大丈夫だと思います。

 

preg_match の正規表現でglobal(全文)オプションが使えない

文字列 “abcdefgabcdefg” に対して、正規表現で /abc/ とやると、最初にでてくる abc がマッチして、二回目の abc にはマッチしない。

文字列に出てくるすべての abc にマッチさせたいばあいは、 /abc/g と言った具合に最後に g オプションをつける。

php の preg_match でも g オプションでいけるだろうと思い

preg_match ( ‘/abc/g’ , $string , $matches ) ;

としたところ

PHP Warning:  preg_match(): Unknown modifier ‘g’

という警告が出た。

調べてみたところ、こういう場合は

preg_match_all のほうを使え、ということだった

preg_match_all ( ‘/abc/’ , $string , $matches ) ;

で解決。めでたし。

ていうか、g オプションつけてよ。。。

PHP で複数ファイルのアップロード処理を書いたが20個しかアップロードできない。

最近のブラウザだと、input タグに multiple 属性をつけると、ひとつのタグで複数のファイルをアップロードすることができる

<input type=”file” name=”files[]” multiple>

こんな感じで簡単。

しかし、調子に乗って30個ぐらいのファイルを一度にアップしようとしたら、一部のファイルしかアップされませんでした。

数えてみるとちょど20個で、それ以降のファイルは取得できない。

調べてみたところ、やっぱり制限がありました。

デフォルトでは20個のようですが、php.ini に max_file_uploads を追加してあげれば制限値を変えられるようです。

私の環境では /etc/php.ini に max_file_uploads = 100 を追加したら100個までアップロードできるようになりました。

変えられるからといってあまり大きい値にするのもどうかと思うので、運用を考えて必要最小限の値にしておきましょう。

php.ini を変更したらWebサーバの再起動も忘れずに。