php
php/win7
php/win10
php/php7
php/Groonga
apache httpdを経由してphpで/tmpを操作する際の注意点 †
CentOS7において、/tmpにファイルを作らせるようなwebアプリをphpで作ったとする
<?php
touch("/tmp/sample");
?>
その際、systemd経由で起動したhttpdだと「/tmp/sample」は作ってくれない
systemdにより「/tmp/systemd-private-XXXX/」に作られる。
回避するには
[root@c ~]# vi /lib/systemd/system/httpd.service
:
:
PrivateTmp=false
[Install]
WantedBy=multi-user.target
[root@c ~]#
と「PrivateTmp」の値を「false」にする
phpからpostgreSQLにデータを登録 †
1
2
3
4
5
6
| <?php
$dsn = "pgsql:dbname=pgroonga_test host=localhost port=54321";
$user="tsuser";
$password="";
$dbh = new PDO($dsn, $user, $password);
?>
|
apache httpdにてブラウザから非同期でプロセスを起動させる †
ブラウザの画面の操作で、サーバー上にプロセスを起動させ(バックグランド)、用が済んだらまたブラウザ操作でプロセスを止める。
画面側はボタンを用意して、それにajaxで非同期で別のurlを呼び出す。
1
2
3
4
5
6
7
8
| function capture_start(){
$.ajax({
type: "POST", url:"start.php",data:{"grid":・・・,"square":・・・,..}
}).done(function(res){
...
}).fail(function(res){
...
});
|
っで、呼び出されたstart.phpでは、入力値の整形とかを行ってphpのpcntl_fork()を使うためにCGIへ流す
pcntl_forkらはCGI/CLIでしか使えない。mod_phpからは使えないみたい
system("/usr/bin/php cgi.php ".$grid." ".$square."...);
pcntl_forkを使うことで、現在使っているプロセスから子プロセスを作り出して、posix_setsidでセッションリーダーにさせる
詳しいことは良く分からないが、下記でapache httpdのプロセスとは関係なくなる....駄目でした。
cgroupで/system.slice/httpd.serviceに関連付けられているから無理みたい
pid = pcntl_fork();
if($pid == 0) {
posix_setsid();
$pid = pcntl_fork();
if($pid == 0) {
file_put_contents( "/tmp/inotify.ps" , posix_getpid() );
pcntl_exec( 'inotify' , array( $store, $run ));
}
}
これでブラウザからinotifyプログラムを起動できて、そのpidは /tmp/inotify.ps に格納される。
あとはブラウザで/tmp/inotify.psを読み込んで、そのpidに対してkillを実行すればいいみたい。
CentOS7でphp5.6を使う †
CentOS7でリリースされているphpはphp5.4
ownCloud9.1を使おうとしたら、これが引っかかった。ownCloundはphp5.6が必要
ここではSoftware Collectionsを使ってphp5.6を使うことにした
[root@c ~]# yum install centos-release-scl
[root@c ~]# yum install rh-php56
[root@c ~]# scl enable rh-php56 bash
これでOK.
使い方は、sclコマンドを使ってパスを乗り換える感じでしょうか。
[illya@c ~]$ php -v
PHP 5.4.16 (cli) (built: Nov 6 2016 00:29:02)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
[illya@c ~]$
[illya@c ~]$ scl enable rh-php56 bash
[illya@c ~]$ which php
/opt/rh/rh-php56/root/usr/bin/php
[illya@c ~]$ php -v
PHP 5.6.25 (cli) (built: Oct 21 2016 18:00:07)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
[illya@c ~]$
っでphp-5.6を使えるのだが、正直スマートではない気がする....
CentOS7でhttpdにphp5.6を利用させるには †
現行のhttpdにロードされているモジュール(php5_module)を差し替えるか、FastCGI系に移るかとなる。
既存のhttpdに手を加えたくないなら、FastCGI系で対処する
留意提供しているサービスが、FastCGI系に対応しているのならこれ
ここで使っているpukiwikiは、このFastCGI系を使うとユーザ認証ができなくなるみたいで、次項の方法にした
まずは、php-5.6のfpm版をインストールします
PHP-FPM (FastCGI Process Manager)
[root@c ~]# yum install rh-php56-php-fpm
次に、httpdの設定ファイルを修正して、php-5.6 fpmのデーモンを稼動させ、httpdを再起動させる
[root@c ~]# diff /etc/httpd/conf.d/php.conf.orig /etc/httpd/conf.d/php.conf
5c5
< SetHandler application/x-httpd-php
---
> SetHandler "proxy:fcgi://127.0.0.1:9000"
[root@c ~]#
[root@c ~]# systemctl enable rh-php56-php-fpm
[root@c ~]# systemctl start rh-php56-php-fpm
[root@c ~]# systemctl restart httpd
その後、コンテンツにphpinfoを表示させるページを儲けて閲覧して確認する

CentOS7でhttpdにphp5.6を利用させるには(その2) †
FastCGI系を利用せず、従来のモジュール形式で行いたいのなら、別のhttpdの切り替えか、httpdはそのままにphp-5.6をコンパイルする必要がある。
phpのコンパイルは簡単だが、一方でyumでモジュール管理できなくなる。
ここでは別のhttpdを入れて従来どおりyumで管理する方法を示す
[root@c ~]# yum install rh-php56-php httpd24-httpd
[root@c ~]# systemctl stop httpd.service
[root@c ~]# systemctl disable httpd.service
これで旧環境は停止。次に新環境の整備。
[root@c ~]# cp -i /etc/httpd/conf.d/*.conf /opt/rh/httpd24/root/etc/httpd/conf.d/
(名前が重複するファイルは移さない)
[root@c ~]# vi /opt/rh/httpd24/root/etc/httpd/conf/httpd.conf
:
<Directory "/var/www">
AllowOverride None
# Allow open access:
Require all granted
</Directory>
:
[root@c ~]#
(従来のコンテンツへのアクセスを許可させる)
その後に
[root@c ~]# systemctl start httpd24-httpd.service
[root@c ~]# systemctl enable httpd24-httpd.service
とする

CentOS 7でphp-5.6をソースからコンパイルする †
sclを使う方法もいいのだが、、やっぱり面倒。httpdも標準品を使いたいなら
phpをソースからコンパイルして使えるようにするしかない。
ここではモノシリックで作ってます
シンボリックリンクの作成はldap向けで、これがないとエラーで作れない
[root@owncloud ~]# yum install httpd-devel httpd postgresql postgresql-devel libxml2-devel gd-devel openssl-devel \
bzip2-devel t1lib-devel gmp-devel pcre-devel cyrus-sasl-ldap libzip
[root@owncloud ~]# ln -s /usr/lib64/libldap.so /usr/lib/libldap.so
[root@owncloud ~]# ln -s /usr/lib64/libldap_r.so /usr/lib/libldap_r.so
[root@owncloud ~]# ln -s /usr/lib64/liblber.so /usr/lib/liblber.so
[root@owncloud ~]# mkdir src && cd $_
[root@owncloud src]# (phpのソースファイルを入手)
[root@owncloud src]# bzip2 -cd php-5.6.30.tar.bz2 | tar xf - && cd php-5.6.30
[root@owncloud php-5.6.30]#
[root@owncloud php-5.6.30]# ./configure \
--prefix=/opt/php \
--disable-debug \
--with-pic \
--disable-rpath \
--without-pear \
--with-bz2 \
--with-freetype-dir=/usr \
--with-png-dir=/usr \
--with-xpm-dir=/usr \
--enable-gd-native-ttf \
--with-t1lib=/usr \
--without-gdbm \
--with-gettext \
--with-gmp \
--with-iconv \
--with-jpeg-dir=/usr \
--with-openssl \
--with-pcre-regex \
--with-zlib \
--enable-exif \
--enable-ftp \
--enable-sockets \
--with-kerberos \
--enable-shmop \
--enable-calendar \
--with-libxml-dir=/usr \
--enable-xml \
--with-mhash \
--with-apxs2 \
--enable-mbstring \
--enable-mbregex \
--with-pdo-pgsql \
--with-pgsql \
--with-gd \
--enable-zip \
--with-curl \
--with-ldap --with-ldap-sasl --enable-pcntl
[root@owncloud php-5.6.30]# make && make test && make install
[root@owncloud php-5.6.30]# cp php.ini-development /opt/php/lib/php.ini
[root@owncloud php-5.6.30]# vi /opt/php/lib/php.ini
:
date.timezone = 'Asia/Tokyo'
:
[root@owncloud php-5.6.30]#
/usr/lib64/httpd/modules に「libphp5.so」がインストールされる
/etc/httpd/conf/httpd.confに
LoadModule php5_module /usr/lib64/httpd/modules/libphp5.so
が追記される。その辺りに
AddType application/x-httpd-php .php
を加えてhttpdを再起動する
CentOS 7のphpでsqliteを使うには †
単にpdoをインストールすれば一緒に入るみたい。あとhttpdの再起動が必要みたい
[root@c ~]# yum install php-pdo
[root@c ~]# rpm -qali |less
:
Name : php-pdo
Version : 5.4.16
Release : 36.3.el7_2
Architecture: x86_64
Install Date: 2016年09月07日 17時18分01秒
Group : Development/Languages
Size : 196979
License : PHP
Signature : RSA/SHA256, 2016年08月12日 19時37分17秒, Key ID 24c6a8a7f4a80eb5
Source RPM : php-5.4.16-36.3.el7_2.src.rpm
Build Date : 2016年08月12日 06時33分19秒
Build Host : worker1.bsys.centos.org
Relocations : (not relocatable)
Packager : CentOS BuildSystem <http://bugs.centos.org>
Vendor : CentOS
URL : http://www.php.net/
Summary : A database access abstraction module for PHP applications
Description :
The php-pdo package contains a dynamic shared object that will add
a database access abstraction layer to PHP. This module provides
a common interface for accessing MySQL, PostgreSQL or other
databases.
/etc/php.d/pdo.ini
/etc/php.d/pdo_sqlite.ini
/etc/php.d/sqlite3.ini
/usr/lib64/php/modules/pdo.so
/usr/lib64/php/modules/pdo_sqlite.so
/usr/lib64/php/modules/sqlite3.so
:
[root@c ~]#
imagickを有効に †
imagickを使いたいので
[root@c ~]# yum install php-pear php-devel ImageMagick-devel
の後で
[root@c ~]# pecl install imagick
とします。そして、php.iniに反映させるために
[root@c ~]# vi /etc/php.d/imagic.ini
extension=imagick.so
[root@c ~]#
とします
確認はphp -iにて
imagick
imagick module => enabled
imagick module version => 3.4.3
imagick classes => Imagick, ImagickDraw, ImagickPixel, ImagickPixelIterator
Imagick compiled with ImageMagick version => ImageMagick 6.7.8-9 2016-06-16 Q16 http://www.imagemagick.org
Imagick using ImageMagick library version => ImageMagick 6.7.8-9 2016-06-16 Q16 http://www.imagemagick.org
ImageMagick copyright => Copyright (C) 1999-2012 ImageMagick Studio LLC
ImageMagick release date => 2016-06-16
ImageMagick number of supported formats: => 209
ImageMagick supported formats => 3FR, A, AAI, AI,(略) TIFF, TIFF64, TILE, (略