質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

725閲覧

PHP: マルチプロセスで起動したphpファイルでは、php.iniの設定が読み込まれないのは何故でしょうか。

ID_7UGzV8hCHGs5

総合スコア58

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

3クリップ

投稿2018/01/09 10:15

編集2018/01/09 10:18

###前提・実現したいこと
概要:
マルチプロセス側でも、php.iniの設定を読み込みたい。
php.iniの設定が読み込まれていないため、 error_log()関数が使用出来ない。

###発生している問題・エラーメッセージ
my_main.phpに「exec関数を使用してマルチプロセスの非同期でmy_async.phpを実行する」処理を記述し、
my_main.phpにブラウザでアクセスしました。

問題無く my_async.php は実行されているようですが、
なぜか、my_async.phpではPHP関数のerror_log('テキスト')が使えません。

現在分かっている事:
my_async.php では、php.iniの設定が読み込まれていないようです。

my_async.phpにてini_set('error_log', 'パス')を使い、値を設定することはできました。

php.iniの全ての設定値をini_set()で設定しなおす事は出来そうですが、
骨が折れそうで途方に暮れております。助けて下さい。

###該当のソースコード
サーバー:centOSの階層
/var/www/html
└my_main.php
└my_async.php

php

1//ファイル名: my_main.php 2 3//マルチプロセス起動 4exec("nohup php -c '' my_async.php >/dev/null 2>&1 &"); 5 6//エラーログを出力 ※出力されます 7error_log('my_main.phpに書いたerror_logです。'); 8

php

1//ファイル名 my_async.php 2 3//エラーログを出力 ※出力されません。(助けて下さい。) 4error_log('my_async.phpに書いたerror_logです。');

###試したこと

  1. my_async.phpが動いているかを確認するために、テキストファイルを書き出せるかをテスト

→OK。 書き出されました。

  1. my_async.phpでini_get('error_log')を使用して、設定値が取れるかテスト

NG。 設定値が取れませんでした。

  1. my_async.phpでini_setでパスを設定し、error_log()が使えるか確認

→OK。 使えました。

上記を試したコードは下記の通りです。

php

1//ファイル名 my_async.php 2 3//エラーログを出力 ※これが出力されない!! 4error_log('my_async.phpに書いたerror_logです。'); 5 6////////////////////////////////////////////////////////////////////////////// 7//上記にてerror_log()が使えない事に対する原因を追究する為、下記のコード試しました。 8////////////////////////////////////////////////////////////////////////////// 9 10 11//テキストファイルを出力 ※出力されます 12file_put_contents('/var/log/php/myLogBy_my_main.php', 'my_async.phpです'); 13 14// iniの設定を確認 15$path = ini_get('error_log'); 16file_put_contents('/var/log/php/myLogBy_my_main.php', $path); // 何も出力されない! 17 18$type = gettype($path); 19file_put_contents('/var/log/php/myLogBy_my_main.php', $type); // 'string'が出力される 20 21$length = strlen($path); 22file_put_contents('/var/log/php/myLogBy_my_main.php', $length); // '0'が出力される 23 24// iniの設定が読み込まれていないようなので、自分で設定したらどうなるか確認 25//値をセット 26ini_set('error_log', '/var/log/php/php_errors.log'); 27error_log('my_async.phpでini_setでパスを設定した後の出力テスト'); //出力される(^^) 28 29//念のために、ini_getで設定した値確認 30$path2 = ini_get('error_log'); 31file_put_contents('/var/log/php/myLogBy_my_main.php', $path2); // '/var/log/php/php_errors.log'が出力される 32

###補足情報(言語/FW/ツール等のバージョンなど)
ブラウザ:
Windows10 Google Chrome

サーバー情報:
CentOS release 6.9 (Final)
Apache/2.2.15 (Unix)
PHP 7.1.12

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

マルチプロセス起動ってところで -c '' って空にしているからではないでしょうか?

php

1//マルチプロセス起動 2exec("nohup php -c 'iniのパス' my_async.php >/dev/null 2>&1 &");

または

php

1//マルチプロセス起動 2exec("nohup php my_async.php >/dev/null 2>&1 &");

かと思いますがどうでしょう?

投稿2018/01/09 10:29

oskbt

総合スコア1895

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ID_7UGzV8hCHGs5

2018/01/09 10:45

回答いただいた2通りにて、php.iniが読み込まれる事を確認しました。 恐ろしい時間をかけて原因追及していました。 本当に本当に助かりました。 exec関数の使い方を熟知していなかったようです。 exce関数の使い方について勉強します。 本当にありがとうございました。
oskbt

2018/01/09 10:50

PHPの関数execではなくコマンドラインでのPHPの実行コマンドに関係します。 php コマンドライン オプションでググるとよく分かるかと思います。
ID_7UGzV8hCHGs5

2018/01/09 11:06

oskbtさん 貴重な情報を頂きありがとうございます。 ※phpの中で記述していたため、 コマンドラインで実行されているという認識がありませんでした。 コマンドラインのオプションについて調べます。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問