XAMPPのPHPをバージョンアップ(5.6→7.3)

XAMPPのPHPをバージョンアップする(5.5→7.2)を参考にさせていただきました。

変更の目的

うちの環境はmargedocさんのPDT(full)で、PDTとxampp(インストール不要zip版)が抱き合わせになってるやつを使ってます。
執筆時点の最新版でバンドルされてるPHPのバージョンが5.6系だったのですが、EC-CUBE4の実行環境を作りたくて、PHP7.3系にしたかった。

概要

  1. PHP7.3のダウンロード
  2. PHP7.3の導入
  3. xamppの設定ファイル調整
  4. xdebugの更新

詳細

PHP7.3のダウンロード

PHPの公式ダウンロードページから任意のバージョンをダウンロードします。
うちの環境(xampp)は64bitなのでVC15 x64 Thread Safe をダウンロード
もし、XAMPPの32bit版を利用している場合はVC15 x86 Thread Safe をダウンロードしてください。

PHP7.3の導入

xampp/phpを適当な名前に変更
※今回は元のバージョンにちなんでphp_56

ダウンロードしたPHPを解凍してフォルダ名を”php”に変更しxamppフォルダに移動

php_56フォルダからphp.iniをphpフォルダにコピー

xamppの設定ファイル調整

この作業をせずにxamppを起動しようとするとapacheがこけるので気づくと思うけど
xampp/apache/conf/extra/httpd-xampp.conf
の設定がphp5用になってるので修正が必要

#LoadFile "[プロジェクトのパス]/xampp/php/php5ts.dll"
LoadFile "[プロジェクトのパス]/xampp/php/php7ts.dll"
#LoadModule php5_module "[プロジェクトのパス]/xampp/php/php5apache2_4.dll"
LoadModule php7_module "[プロジェクトのパス]/xampp/php/php7apache2_4.dll"

モジュール名をここで変えてしまったので

#<IfModule php5_module>
<IfModule php7_module>

※複数あり

のように修正

xdebugのダウンロード

PHPのバージョンが変わったのでxdebugもバージョンアップする必要があります

xdebug公式から任意のバージョンのdllを落とします。
※今回はphp7.3系で VC15 TSのx64なのでPHP 7.3 VC15 TS (64 bit) をダウンロード

ダウンロードしたファイルをphp_xdebug.dllにリネームして”xampp/php/ext/”配下にコピー

xamppにca証明書を設定

参考:http://nanoappli.com/blog/archives/7992

composer.pharやらsymfony.pharでcurlするときに次のようなエラーが出たときの対処法

cURL error 60: SSL certificate problem: unable to get local issuer certificate

内容的には信頼できるca証明の一覧が無いぞ~!ってことらしい

cacert.pemをダウンロードして、phpのディレクトリ放り込む
php.iniのcurlセクションの「curl.cainfo」にcacert.pemのフルパスを指定する。

[curl]
curl.cainfo = "[PHP_ROOT]cacert.pem"

※私みたいにプロジェクトごとにxammp環境作ってるようなら共通で使いまわす方が楽かも

PS.
念のためcreate.pemについて提供元を確認してみた。
WindowsでCURLでCURLコマンドを落としたとこでした。

pemの内容については
https://curl.haxx.se/docs/caextract.html
で確認できる。

色々あるsymfony2のインストール方法

色々調べてみたところホントに色々な入れ方やらパッケージ?があるみたいなのでとりあえず整理します。

composerを使ったやり方

php composer.phar create-project [パッケージ] [インストール先のpath] [バージョン]

例)php composer.phar create-project symfony/framework-standard-edition /path/to/webroot/Symfony 2.3.0

php composer.phar search [文字列] 

で探してみたけど数が多すぎると全部は出してくれないっぽいので

[パッケージ]と[バージョン]はPagkagistで探す方がいいらしい。

ちなみに、composerはcomposer.jsonってファイルでパッケージ等を設定して

php composer.phar install

ってする方法もあるようで、むしろこっちが一般的?

symphony.pharを使ったやり方

php -r "readfile('https://symfony.com/installer');" > symfony.phar
php symfony.phar [コマンド] [インストール先のpath] [バージョン]

例)
php symfony.phar new symfony2 2.3.0
php symfony.phar demo symfony2 2.3.0

newとdemoの違いはよくわからない。。。

helpを見るには

php symfony.phar

xampp環境でEC-CUBE3開発を少し楽にするコマンドプロンプト起動バッチ

EC-CUBE3ってややこしや(笑

composerや各種ジェネレータの利用などなんだかんだとコマンドプロンプトを使う機会が多いのですが、
xampp環境(zip版)だとpathが通ってないので色々面倒

っということでバッチを作りました。

cmd /k set path=%~dp0xampp\php;%path%

cmd /k
この部分でバッチが勝手に閉じられないように対処

set path=%~dp0xampp\php;%path%
ここでpathを通す作業

set
コマンドプロンプトで環境変数を設定するためのコマンド

set path=
これでPATHを設定しますよ~って意味

%~dp0
これで今いるディレクトリパスが取れるらしくて最後にディレクトリセパレータが入ってます。
例) c:\windows\

xampp\php
ここはバッチを置いたディレクトリからphp.exeまでのPATHですね

;
PATHセパレータ

%path%
「既に登録されてるPATH」=環境変数のを参照する。

つまり
set path=[xampp/phpまでのフルパス];%path%

をしてるってこと。

mysqlにもPATHを通すなら

cmd /k set path=%~dp0xampp\php;%~dp0xampp\mysql\bin;%path%

XAMPPにComposerのインストール

margedocさんのオールインワン等PC内に複数環境を作っている場合の情報とかがなかったので残します。

コマンドプロンプトから次を実行

>cd [xampp/phpのパス]
[xampp/phpのパス]>php  -r "eval('?>'.file_get_contents('https://getcomposer.org/installer'));"
Failed loading \project\ec-cube3\pleiades\xampp\php\ext\\project\ec-cube3\pleiades\xampp\php\ext\php_xdebug.dll
All settings correct for using Composer
Downloading...

Composer (version 1.5.2) successfully installed to: [xampp/phpのパス]\composer.phar
Use it: php composer.phar

こんだけ。

ザックリいうと、composer.pharがphpのパスの通ってるところにあれば良いっぽい

次のコマンドで動作確認

[xampp/phpのパス]>php composer.phar
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 1.5.2 2017-09-11 16:59:25

Usage:
  command [options] [arguments]

こんなのが表示されればとりあえず動いてるらしい

composerを利用する場合は
↑みたいに

php composer.phar [パラメータ]

カレントが[xampp/phpのパス]以外だと

php [xampp/phpのパス]composer.phar [パラメータ]

ってしなきゃダメ臭い。
すんごい面倒なのでバッチを作る

[xampp/phpのパス]>echo @php "%~dp0composer.phar" %*>composer.bat

これでcomposer.batが作られました。
※[xampp/phpのパス]で実行しないとダメなので注意!
そしてディレクトリ名変更したら修正しなきゃダメなのでこの点も注意!
っても絶対このこと忘れてるよねwww

今後は「php composer.phar」を「composer」って読み替えて使う

カテゴリー: PHP

CakePHP2 Formヘルパーのcheckboxの使えなさときたら。。。

checkboxで複数選択の項目を作る場合、cakephpでは次のように書く説明がよくみられます。

$options = array('foo','var');
$formdata = $_POST['data'][フィールド名];

$this->form->input("フィールド名",
 	array(
 		'type'=>'select',
 		'multiple' => 'checkbox',
 		'div'=>false,
 		'label'=>false,
 		'legend'=>false,
 		'options' = $options,
 		'selected' = $formdata,
	)
);

確かに複数で出力される。

だがしかし!「’div’=>false」が効いてない(´・ω・`)

チェックボックスを横並び出来ないっていう。。。。
ソース追いかけたらdivオプション自体がシカトされてる。

皆どうしてるんだろう???

そもそも$this->form->inputは色々な機能を盛り込んだ$this->form->xxxxのalias的な物
エラーメッセージの出力なども自動でやってくれる便利な子ではあります。
色々共通化した結果の歪がこれなんでしょうね。

けど、CakePHPってこうした落とし穴がところどころ存在して悩まされる。
普通に使うFormヘルパーにもこんな落とし穴作るとかもうダメダメじゃん。。。
何でこんなフレームワークが日本でたくさん使われてるのかマジ理解不能。

さらに今回はフィールド名のところを空にしたり、name属性を調整したりと
ソース踏襲の為にFormヘルパーを使て次のように対応

$options = array('foo','var');
$formdata = $_POST['data'][フィールド名];

$i=0;
foreach($options as $val){
	$checked=false;
	if( $data[フィールド名][$i] == $val ) $checked = true;

	echo '<label>';
	echo $this->Form->input(false,
		array("name"=>"data[フィールド名][$i]","type"=>"checkbox",'label'=>false,'div'=>false,'value'=>$val,"checked"=>$checked));
	echo $val.'</label> ';
	$i++;
}
if(isset($errors[フィールド名])) echo '<div class="error-message">'.$errors[フィールド名][0].'</div>';

第1引数のフィールド名をfalseにして色々な機能をOffにして対応。
とりあえず目的の事は出来た。

で、テストしてたら何故だか直前の入力フィールドのエラーメッセージがこのcheckboxに反映されるという
奇々怪々な現象が発生。

いやね、最初は私がフィールド名を間違って書いたのかと思いましたよ。
けどそうじゃなかった!!

inputメソッドの第1引数にフィールド名を指定して使った後に
inputメソッドの第1引数にfalseを使うと、前者のエラーメッセージを拾い上げてくれる優れもの!
もう失笑です。

‘error’=>false

のオプションを追加して非表示にできたけどもさ。。。
もうほんと、なんだかなぁ~って感じです。

昔から不勉強を棚に上げて「使いにくいから!」とFormヘルパーを使わずにゴリゴリPHPコード書いてたんだけど、
やっぱりその方法が正解のようです。

ちなみにバージョンは2.7.8です。

EC-CUBE::多数注文中にカートが空になる

MySQLを利用したEC-CUBEサイトで件名の不具合が出るようです。

原因はdtb_session.sess_dataの型がtextになっていて、文字列が足りなくなったために起こるようです。

EC-CUBEはsessionデータをDBで保存しており、serializeしたsessionデータを保存しています。

対策としては次のコードを実行する。

alter table dtb_session change sess_data sess_data longtext;

MySQLの仕様を確認したところ、文字列の長さは次の通り

text longtxt
65,535byte 4,294,967,295(4G)

私の環境では65kどころか1k程度でセッションが途切れてました。

writeする前に既に文字が途切れていた節もあって、この対応ですべて片付くかは微妙な所。

ひとまずこの対応で様子見をしてみます。

※SC_Helper_Session.sfSessWrite()の第2引数「$sess_data」がわたって来た時点で途切れていた。
※UTF-8環境で若干の日本語文字を含みます。

EC-CUBE3.0.x::xamppにインストール

php.iniを開いて次のエクステンションを有効にします。

extension=php_curl.dll
extension=php_fileinfo.dll
extension=php_openssl.dll

※私の環境だと上記でOKでした。
※エクステンションを有効にするにはxampp(apache)の再起動が必要です

あとはEC-CUBE2.x同様ルートディレクトリにアクセスすればインストールウィザードが表示されます。

ようこそ  EC-CUBEインストール

WinCacheはIIS上でしか動かないようなので無視してよさそうです。

EC-CUBE3.0.x::xampp環境でインストール時にエラー「RuntimeException in SecureRandom.php line…」

EC-CUBE3.0.xをインストールしようとしてhttp://localhost/install.phpにアクセスするとエラーが表示されました。
URLは「/install.php/step1」です。

■原因
opensslが必要なようなのでphpのエクステンション「php_openssl」を有効化しましょう。

■手順
php.iniの

#extension=php_openssl.dll

これのコメントを外して

extension=php_openssl.dll

として保存してください。

xamppを再起動すれば無事インストール画面が表示されるはずです。

PHP::先頭?が表示されるけどなんで!?

PHPでプログラムをしていてごくまれに先頭に?が表示されて「なにこれ。。。キモイ」って思うことがあります。

うん。。。あるんです。

どこで出力されてるやらさっぱり分かんない謎の「?」

その答えはきっと文字コードの問題。

UTF-8(BOM有)の保存形式になってないですか!?

UTF-8(BOM有)だと0xEF BF BF っていう3バイトの符号がファイルの先頭についてしまうんだそう。

先頭以外のところで?があったら、それはきっと「~」でしょう。
これを「~」が?になっちゃう問題を波ダッシュ問題って言います。

カテゴリー: PHP