2014年04月30日

PHP Warning: PHP Startup: Unable to load dynamic library

PHP で拡張モジュール(ライブラリ)の指定でエラーが出た場合の対処法です。

以下、例としてPhalcon PHP framework をインストールしたときの場合を例に、説明します。
php.ini に以下の記述をしてフレームワークの設定をしたと仮定します。
extension=phalcon.so

この設定でコマンドラインのphp (php-cli) 以下のような警告が出た場合、エクステンションはロードされません。
$ php -r "print_r(get_loaded_extensions());" | egrep phalcon
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/local/php-5.5.11/lib/php/extensions/no-debug-non-zts-20121212/phalcon.so' - /usr/local/php-5.5.11/lib/php/extensions/no-debug-non-zts-20121212/phalcon.so: cannot open shared object file: No such file or directory in Unknown on line 0


詳しくはphp -i などれ調べると分かりますが、エクテンションのダイナミック・ライブラリ(.so)のファイルが、設定上のディレクトリ(上記の場合:/usr/local/php-5.5.11/lib/php/extensions/no-debug-non-zts-20121212)に存在しないという事です。

この場合、対処法としてPHPの設定まで含めるといくつかあるのですが、以下の2つが最初の処方箋となるでしょう。

  • 警告で指定されているディレクトリにダイナミック・ライブラリ(.so)をコピーする

  • php.iniでダイナミック・ライブラリをフルパスで指定する


Phalcon framework のインストール時のログを確認すると、soは以下の場所にありました。
/usr/lib64/php/5.5/modules/phalcon.so

前者は、このファイルを「/usr/local/php-5.5.11/lib/php/extensions/no-debug-non-zts-20121212」にコピーする方法。
後者は、phalcon.soのフルパス(/usr/lib64/php/5.5/modules/phalcon.so)をphp.iniの「extension=」に記述するやり方です。

いずれもPHPの環境に依存しますので、phpinfo 等で確認して設定してみてください。


posted by ayagu at 10:37| Comment(0) | PHP | このブログの読者になる | 更新情報をチェックする

2014年04月28日

AWS 時間を合わせる - タイムゾーンの設定

アマゾンのクラウド・サービス AWS(Amazon Web Service)が熱いです。
どこから始めたらいいのかと思う人は、入門として「AWSをはじめよう」を参照してみて下さい。

EC2 というクラウドの中のホスティング・サービスが中心となると思いますが、タイムゾーンの設定は、EC2インスタンスを作ったあと、始めにやっておかないといけないことの一つです。

サーバーサイドには、データベースやアクセスログなど、正確な時間が要求される要件がサービスが数多く有ります。後回しにしていると、後々、痛い目にあうかもしれません。

以下は、まっさらなインスタンスを作ったあと、リモートログインして時間表示したものです。

[ec2-user@ip-xxx-xx-xx-xx ~]$ date
2014年 4月 27日 日曜日 23:21:43 UTC


「UTC」(協定世界時 - Wikipedia) になってます。これを日本標準時間に設定し直します。

やり方は2通り、(以下はFedra/CentOSでも共通です)

  • 環境変数TZに設定する

  • /etc/localtimeを設定する



環境変数TZに設定する


TZを「Asia/Tokyo」に設定すると瞬時に変わります。
[ec2-user@ip-xxx-xx-xx-xx ~]$ date
2014年 4月 27日 日曜日 23:21:43 UTC
[ec2-user@ip-xxx-xx-xx-xx ~]$ export TZ='Asia/Tokyo'
[ec2-user@ip-xxx-xx-xx-xx ~]$ date
2014年 4月 28日 月曜日 08:32:39 JST

ただし、使用しているシェルの環境のみの設定なので、起動時にシステムレベルの有効になるように、「/etc/bashrc」の最後の行に以下の項目を加えます。
export TZ='Asia/Tokyo'

その後反映させるには、再起動するか、もしくは
[ec2-user@ip-xxx-xx-xx-xx ~]$ source /etc/bashrc

で読み込みます。

/etc/localtimeを設定する


個人的にはこちらがオススメです。
各国タイムゾーンの情報は「/usr/share/zoneinfo」ディレクトリにあります。
ここからタイムゾーン情報を選んで「/etc/localtime」にコピーします。
/etc/localtime はUTCを表示しているデフォルトのものが既に存在しますので、必要であれば、バックアップをとっておきましょう。
[ec2-user@ip-xxx-xx-xx-xx ~]$ date
2014年 4月 27日 日曜日 23:48:48 UTC
[ec2-user@ip-xxx-xx-xx-xx ~]$ sudo cp /usr/share/zoneinfo/Japan /etc/localtime
[ec2-user@ip-xxx-xx-xx-xx ~]$ date
2014年 4月 28日 月曜日 08:50:23 JST


以下の例でもOKです。
[ec2-user@ip-xxx-xx-xx-xx ~]$ sudo cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime


タグ:timezone cloud AWS
posted by ayagu at 08:57| Comment(0) | AWS | このブログの読者になる | 更新情報をチェックする

2014年04月22日

php.ini ってどこに?

Nginx やらyii framework やらを使う決断をしたら、AWS(Amazon Web Service) にPHPをソースからビルド&インストールするはめになった。
なれない事をやると、いろいろつまずく。
今回はその一つ、

「php.iniってどこ?」

って話。そもそも共有サーバーではそのファイルは予め設定済みで、カスタマイズしようとしても、宿借りの分際では触る事さえ許されてないもの。各ドキュメント・ルートにphp.iniを置くと読み込んでくれるが、大本はどこって話になると「/etc ?」って、探したりすることになる。

愚かにも、ビルド時の "./configure" に " --prefix" オプションを指令しなかったばっかりにどこにインストールされたものやら、さっぱり。

そんなときはには、ちゃんと便利はオプションが用意されています。その名もズバリ「php -ini」。
phpinfo() 関数の結果をそのまま出力するもので、基本的に「php --info」や「php -i」の出力も同じ。以下実行例ですが、大量の情報がダンプされるので、途中まで
$ php -ini
phpinfo()
PHP Version => 5.5.11

System => Linux ip-172-31-28-114 3.10.35-43.137.amzn1.x86_64 #1 SMP Wed Apr 2 09:36:59 UTC 2014 x86_64
Build Date => Apr 21 2014 19:20:42
Configure Command => './configure' '--enable-sigchild' '--with-openssl=shared'
'--with-kerberos' '--with-zlib=shared' '--enable-bcmath=shared' '--with-bz2=sha
red' '--with-curl=shared' '--enable-exif=shared' '--enable-ftp=shared' '--with-g
d=shared' '--enable-gd-native-ttf' '--enable-gd-jis-conv' '--with-gettext=shared
' '--with-gmp=shared' '--with-mhash=shared' '--with-imap=shared' '--with-imap-ss
l=shared' '--enable-intl' '--with-ldap=shared' '--enable-mbstring=shared' '--wit
h-onig' '--with-mcrypt=shared' '--with-mysql=shared,/usr' '--enable-pcntl' '--wi
th-pdo-mysql=shared' '--with-mysqli=shared' '--with-readline=shared' '--enable-s
hmop=shared' '--with-snmp=shared' '--enable-soap=shared' '--enable-sockets=share
d' '--enable-sysvmsg' '--enable-sysvsem' '--enable-sysvshm' '--with-tidy=shared'
'--enable-wddx=shared' '--with-xsl=shared' '--enable-zip=shared' '--enable-zend
-signals' '--with-zlib-dir' '--with-freetype-dir=share' '--with-t1lib=share' '--
with-xpm-dir=shared' '--with-libdir=lib64' '--enable-fpm' '--with-tsrm-pthreads'
'--enable-maintainer-zts' '--with-pdo-mysql'
Server API => Command Line Interface
Virtual Directory Support => enabled
Configuration File (php.ini) Path => /usr/local/lib
Loaded Configuration File => (none)
Scan this dir for additional .ini files => (none)
Additional .ini files parsed => (none)

...


ご丁寧に、configure で指定したオプションまで出してくれてる。
そして今回の目的で注目するところは「Configuration File (php.ini) Path =>」と「Loaded Configuration File =>」
なにもしてないので「Loaded Configuration File => (none)」。
php.ini は「Configuration File (php.ini) Path 」の示すところに置きなさいということで、素直に置いてもう一度。

$ php -ini
...

Configuration File (php.ini) Path => /usr/local/lib
Loaded Configuration File => /usr/local/lib/php.ini

...


無事読み込んでくれたようです。

共有サーバーって、いたせりつくせりだったと実感した瞬間

タグ:php.ini PHP
posted by ayagu at 09:59| Comment(0) | PHP | このブログの読者になる | 更新情報をチェックする
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。