php

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を実行すればいいみたい。

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」にする

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を表示させるページを儲けて閲覧して確認する
2017y05m16d_164649205.png

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

とする
2017y05m16d_174607014.png

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, (略

トップ   編集 添付 複製 名前変更     ヘルプ   最終更新のRSS
Last-modified: 2017-08-16 (水) 05:48:35 (1d)