備忘録(PHP)」カテゴリーアーカイブ

古いLaradockを利用するとworkspaceコンテナが落ちる

とある開発環境をLaradockで構築しており、久しぶりに起動してみることに。

コンテナをbuildしていくと、途中で落ちる現象にぶち当たる。

 => ERROR [laradock_workspace 54/92] RUN if [ true = true ]; then     mk  34.7s
------
 > [laradock_workspace 54/92] RUN if [ true = true ]; then     mkdir -p /home/laradock/.nvm &&     curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash         && . /home/laradock/.nvm/nvm.sh         && nvm install node         && nvm use node         && nvm alias node         && if [  ]; then         npm config set registry          ;fi         && if [ true = true ]; then         npm install -g gulp         ;fi         && if [ false = true ]; then         npm install -g bower         ;fi         && if [ true = true ]; then         npm install -g @vue/cli         ;fi         && if [ false = true ]; then         npm install -g @angular/cli         ;fi         && ln -s `npm bin --global` /home/laradock/.node-bin ;fi:
#0 0.260   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
#0 0.268                                  Dload  Upload   Total   Spent    Left  Speed
100 12819  100 12819    0     0  15831      0 --:--:-- --:--:-- --:--:-- 15924
#0 1.091 => Downloading nvm from git to '/home/laradock/.nvm'
=> Cloning into '/home/laradock/.nvm'...
#0 2.918 => Compressing and cleaning up git repository
#0 2.970
#0 3.031 => Appending nvm source string to /home/laradock/.bashrc
#0 3.058 => Appending bash_completion source string to /home/laradock/.bashrc
#0 3.206 => Installing Node.js version node
#0 13.11 Downloading and installing node v19.3.0...
#0 13.88 Downloading https://nodejs.org/dist/v19.3.0/node-v19.3.0-linux-x64.tar.xz...
######################################################################## 100.0%
#0 15.90 Computing checksum with sha256sum
#0 16.19 Checksums matched!
#0 22.75 node: /lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.27' not found (required by node)
#0 22.75 node: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.25' not found (required by node)
#0 22.75 node: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.28' not found (required by node)
#0 22.85 nvm is not compatible with the npm config "prefix" option: currently set to ""
#0 22.85 Run `nvm use --delete-prefix v19.3.0` to unset it.
#0 23.71 Failed to install Node.js node
#0 23.71 => Close and reopen your terminal to start using nvm or run the following to use it now:
#0 23.71
#0 23.71 export NVM_DIR="$HOME/.nvm"
#0 23.71 [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
#0 23.71 [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion
#0 32.22 v19.3.0 is already installed.
#0 32.76 node: /lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.27' not found (required by node)
#0 32.76 node: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.25' not found (required by node)
#0 32.76 node: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.28' not found (required by node)
#0 32.84 nvm is not compatible with the npm config "prefix" option: currently set to ""
#0 32.84 Run `nvm use --delete-prefix v19.3.0` to unset it.
#0 33.53 Creating default alias: default -> node (-> v19.3.0)
#0 34.55 node: /lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.27' not found (required by node)
#0 34.55 node: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.25' not found (required by node)
#0 34.55 node: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.28' not found (required by node)
#0 34.63 nvm is not compatible with the npm config "prefix" option: currently set to ""
#0 34.63 Run `nvm use --delete-prefix v19.3.0` to unset it.

以前は正常に起動していたのに。

なぜ・・・・。

エラーを見ると、version `GLIBC_2.28′ not found。

要するに無いよ。と怒られる。

nodeのバージョンによってはこの現状が出てくるとか。

ということで、原因はnodeのバージョン。

https://github.com/laradock/laradock/issues/1564#issuecomment-423705186

envファイルを見ると

###########################################################
################ Containers Customization #################
###########################################################

### WORKSPACE #############################################

WORKSPACE_COMPOSER_GLOBAL_INSTALL=true
....
WORKSPACE_INSTALL_NODE=true
WORKSPACE_NODE_VERSION=node

nodeのバージョンは特に指定していない。

ということは最新が当たってしまっている。

なので、nodeのバージョンを指定することで無事解決。

#WORKSPACE_NODE_VERSION=node
WORKSPACE_NODE_VERSION=v10.24.1

ある日突然laradockが起動しなくなった話

いつもどおりlaradockを起動しようとすると次のメッセージが出て起動しない。

------
 > [laradock_workspace  5/92] RUN set -xe;     apt-get update -yqq &&     pecl channel-update pecl.php.net &&     groupadd -g 1000 laradock &&     useradd -u 1000 -g laradock -m laradock -G docker_env &&     usermod -p "*" laradock -s /bin/bash &&     apt-get install -yqq       apt-utils       libzip-dev zip unzip       php7.3-zip       nasm &&       php -m | grep -q 'zip':
#40 0.252 + apt-get update -yqq
#40 31.24 + pecl channel-update pecl.php.net
#40 31.29 Updating channel "pecl.php.net"
#40 31.69 Update of Channel "pecl.php.net" succeeded
#40 31.69 + groupadd -g 1000 laradock
#40 31.70 + useradd -u 1000 -g laradock -m laradock -G docker_env
#40 31.73 + usermod -p * laradock -s /bin/bash
#40 31.74 + apt-get install -yqq apt-utils libzip-dev zip unzip php7.3-zip nasm
#40 33.07 E: Unable to correct problems, you have held broken packages.
------
failed to solve: rpc error: code = Unknown desc = executor failed running [/bin/sh -c set -xe;     apt-get update -yqq &&     pecl channel-update pecl.php.net &&     groupadd -g ${PGID} laradock &&     useradd -u ${PUID} -g laradock -m laradock -G docker_env &&     usermod -p "*" laradock -s /bin/bash &&     apt-get install -yqq       apt-utils       libzip-dev zip unzip       php${LARADOCK_PHP_VERSION}-zip       nasm &&       php -m | grep -q 'zip']: exit code: 100

why?

やったことは、dockerのアップデートが走ったぐらい。

環境は

Macbook2019

Mac OS Big Sur(11.4)

docker desktop(3.5.2)

うーん。

いろいろ調べて以下で無事起動

workspace/Dockerfile の以下をコメントアウト

# always run apt update when start and after add new source list, then clean up at end.
RUN set -xe; \
    apt-get update -yqq && \
    pecl channel-update pecl.php.net && \
    groupadd -g ${PGID} laradock && \
    useradd -u ${PUID} -g laradock -m laradock -G docker_env && \
    usermod -p "*" laradock -s /bin/bash && \
    apt-get install -yqq \
	  apt-utils ←追加
      ###apt-utils \ ←コメントアウト 
      #
      #--------------------------------------------------------------------------
      # Mandatory Software's Installation
      #--------------------------------------------------------------------------
      #
      # Mandatory Software's such as ("php-cli", "git", "vim", ....) are
      # installed on the base image 'laradock/workspace' image. If you want
      # to add more Software's or remove existing one, you need to edit the
      # base image (https://github.com/Laradock/workspace).
      #
      # next lines are here becase there is no auto build on dockerhub see https://github.com/laradock/laradock/pull/1903#issuecomment-463142846
      ###libzip-dev zip unzip \ ←コメントアウト 
      # Install the zip extension
      ###php${LARADOCK_PHP_VERSION}-zip \ ←コメントアウト 
      # nasm
      ###nasm && \ ←コメントアウト 
      ###php -m | grep -q 'zip' ←コメントアウト 

PHP CSVファイルをダウンロードすると1行目に改行が入る

PHPにてCSVを生成して、ダウンロードするプログラムを書いていたのですが、
何故か1行目に改行がはいる状態。

調べてみると、スクリプトの最後 ?>のあとに改行があると出力されるとか。
しかし、スクリプトのあとに改行はない。

生成したCSVファイルを一度ファイルとして保存してみると、改行がない。
生成したCSVファイルをreadfileで読み込み出力すると改行がはいる。

続きを読む

PHPからバッチファイルを実行してpsql.exeを実行する方法

windowsシステムで稼働しているApache,PHPから、PostgreSQLへのテキストファイルのインポートを実施したいのですが、
PHPのexecでコマンドを実行するとなぜかブラウザがタイムアウトするまで読み込み中。
しかも、処理が完了していない。

execのコマンドの構文が間違っているのか?
調べたところ、psqlコマンドに-cと-qのオプションがないと対話式になってしまう。

-c ‘SQL’ クエリ(SQL)を直接実行
-q psqlが対話なしに実行される。

しかし、状況変わらず。

一度バッチファイルに処理を書き出して実行するもNG.
しかし、サーバー上でバッチファイルを実行すると正常動作。

さらに調べたところ、パスワードの入力待ちではないのか。
そもそもwindowsのApacheはサービスで稼働しており、daemonとして実行。
パスワードファイルを作成するとコマンドプロンプトではパスワード聞かれないみたい。
(参照:http://www.postgresql.jp/document/8.4/html/libpq-pgpass.html)

環境変数にセットすればいいのでは。
バッチファイルの先頭にパスワードセットのコマンドを出力するように変更。
SET PGPASSWORD=xxxxxxx

正常に動作しました。

出力やエラーが出ないのでハマりました。

CentOS 5にPHP5.2以上をインストール

CentOS 5系でyum install php でインストールした場合にはPHP5.1.6がインストールされる。

別にプログラム自体は問題なかったのだけど、phpmyadminの最新版は対応していない。

そこで、PHP5.2以上をインストールしなければ。

そのときに、やったことをメモ。

# rpm –import http://www.jasonlitka.com/media/RPM-GPG-KEY-jlitka
# vi /etc/yum.repos.d/utterramblings.repo
[utterramblings]
name=Jason’s Utter Ramblings Repo
baseurl=http://www.jasonlitka.com/media/EL$releasever/$basearch/
enabled=0
gpgcheck=1
gpgkey=http://www.jasonlitka.com/media/RPM-GPG-KEY-jlitka
priority=0

最期の行のpriority=0を設定

# yum –enablerepo=rpmforge –enablerepo=utterramblings update php

終わったらrpmforgeとutterramblingsはenabled=0に設定。

FPDFで出力したPDFを印刷するときの注意点

FPDFで出力したPDFを印刷したときに、フォントが違うので悩まされました。
Windowsだと、近いフォントで出力されますが、Macだと少し違うフォントで出力されます。
と、言うかインストールされているフォントによって異なります。
調べた結果、印刷するときにはコンピュータにインストールされているフォントが使われいるみたいです。
PDFで表示されているから、そのまま印刷されるだろうと思ってました。

原因は、FPDFで出力したPDFのフォントがコンピュータにないからです。
FPDFのjapanese.php内のフォント指定が“KozMinPro-Regular-Acro”となっています。
これは、標準での設定だったと思います。
これを、“KozMinPr6N-Regular”に変更すると表示と同じ印刷結果になりました。

この”KozMinPr6N-Regular”というのは、Adobe Reader Xに組み込まれているものですが、バージョンが上がると変わるかもしれないので注意が必要です。

時間のかかる処理でブラウザタイムアウトの対策(firefox)

PHPなどで、処理を実行するときに長時間の処理となってしまう場合、ブラウザ側でタイムアウトとなってしまい継続処理がうまく実行できない場合があります。

定期的にパケットを送信してタイムアウトにならないように対策をしますが、それでも対応できない場合にブラウザのタイムアウトの設定を調整します。定期的にパケットを送信してタイムアウトにならないように対策をしますが、それでも対応できない場合にブラウザのタイムアウトの設定を調整します。

Firefoxについては、アドレスバーにabout:configと入力することで設定画面を開くことが出来ます。

表示された項目のnetwork.http.keep-alive.timeoutという項目がタイムアウト時間にあたります(秒数指定)。

続きを読む

四則演算は必ず変数に格納するべき?

PHPで、四則演算をすることって多々あると思います。

その中で、小数点を含む計算をしたときに、コンピュータは賢いようで賢くないので、誤計算をしてしまいます。

例えば、
(0.1 + 0.7) * 10
答は、8なのですが、
コンピュータが出した答は7

おいおい、ってなるんですよね。

PHPだと、bcadd()関数を使って計算しないとダメなのです。
乗算の場合は、bcmul()関数。

ところが、いろいろとやっているうちに、同じ計算をしているのに現象が起きるページと起きないページがあるんです。

なぜか?

違いを見比べて見たところ、
現象が起きているページ→計算結果を直接出力している。
現象が起きていないページ→計算結果を変数に格納してから、出力している。
PHPのバージョンかもしれませんが、私の環境下ではこのような結果になりました。

結論:
計算結果は、一度変数に格納してから、出力するといい。

もしかすると、特定の環境下という条件かもしれません。

詳しい情報お持ちの方は、ご教授下さい。

PHP mb_detect_encoding の返り値がfalse

PHPでファイルの内容を読み取りデータベースにインポートするプログラムを構築していたのですが、ファイルのエンコードが不明だったので、mb_detect_encodingを使ってエンコードを調べてから、処理をすることにしていました。

しかし、mb_detect_encodingの返り値がFALSEしか返ってこない。
なぜ??

調べてみると、
mb_detect_order(‘auto’);
print_r(mb_detect_order());
を実行。

すると、結果は
.
Array ( [0] => ASCII [1] => UTF-8 ) bool(false)
ん?

ASCIIとUTF-8しかない。

テストで取り込んでいたテキストは、EUCとSJIS。

納得。

PHP6の新機能 備忘録まとめ1

PHP6の正式版のリリースが待たれていますが、現在多くのプログラムはバージョン4、5で稼動しています。
一部のサーバではPHP4からPHP5への移行を行っていますが、いまだにPHP4,5は現役と言えるでしょう。
しかし、PHP6のリリースでPHP4,5,6と環境が3つになると管理が面倒になります。
少なくとも、私は未だPHP6というものをよく知りません。
そこで、今回はPHP6について新機能を備忘録として記載しておくことにしました。

続きを読む