teratail header banner
teratail header banner
質問するログイン新規登録
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

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

Q&A

解決済

1回答

1155閲覧

コマンドラインからの実行の場合、PHPの $_SERVER 変数はどのようにセットしたらいいのでしょうか?

takenokonyokki

総合スコア10

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

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

0グッド

0クリップ

投稿2022/04/02 11:17

0

0

PHPをコマンドラインから実行した場合でも、 $_SERVER 変数をブラウザアクセスのときと同じように揃えておく方法はありますか?

今日までブラウザアクセスのみを前提とし、$_SERVER 変数を用いて色々な関数を組み立ててきました。

本日コマンドラインでの実行を試みたのですが、 $_SERVER 変数がブラウザアクセスの場合と異なるようで、以下のエラーになります。


php -r'require_once "/home/testserver/example.com/public_html/wp-config.php";'

[02-Apr-2022 10:53:21 UTC] PHP Notice: Undefined index: HTTP_HOST in
/home/testserver/example.com/public_html/define.php on line 63
[02-Apr-2022 10:53:21 UTC] PHP Notice: Undefined index: REMOTE_ADDR in
/home/testserver/example.com/public_html/define.php on line 154


このケースの対処法を知りたいです。

検索し【php】コマンドラインでの実行かどうか判別する を参考にしましたところ、コマンドラインか否かの切り分け方を見つけました。

そして、$_SERVER 変数は「自分が今このChromeでアクセスした場合」のみを考えておりますので、可変的にする必要はございません。

よって恐らく define.php (上記エラーの出たファイル)の先頭に以下を記述すれば済む問題だろうと想像できます。


if (php_sapi_name() == 'cli') {
$_SERVER = ['自分でブラウザアクセスと同様の値をセットしなおす'];
}


ですけれど、 $_SERVER 変数を上書きすることに抵抗があります。もっとスマートな、本来の方法はないものかと思い、こちらで質問させていただく運びとなりました。

例えば、コマンドラインに「次のコマンドは、Chrome からのアクセスということにした上で、実行せよ」などを書けば良さそうに思いますが、そんな呪文あるのでしょうか…

初心者につき情報の不足などあるかもしれませんので、その折はどうぞ遠慮なく仰ってください。
よろしくお願い致します。

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

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

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

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

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

hoshi-takanori

2022/04/02 11:19

コマンドラインから実行する場合、$_SERVER 変数には意味がないと思いますけど…。
takenokonyokki

2022/04/02 11:29

ご指摘ありがとうございます。 ブラウザアクセスの場合に、例えば次の処理を書いています。 $_SERVER['REMOTE_ADDR'] でIPアドレスを取得 → IPアドレスをSQLで INSERT そして今回コマンドラインで行いたい処理は、テストデータの大量 INSERT です。(ブラウザアクセスではタイムアウトした時点で処理が止まってしまうため、コマンドラインならその心配がなさそうかもと考えたためです。) この大量 INSERT にあたって先のIPアドレスが必要になりますので、それならば$_SERVER['REMOTE_ADDR'] にIPアドレスがあった方が楽かも。と考えました。 (もちろん「コマンドラインからのアクセスを分岐し、それなら特性の値をIPアドレスとして扱って INSERT する」というコードを書き足してもいいのですが、そもそも $_SERVER['REMOTE_ADDR'] をセットする方法があるんじゃなかろうか、という疑問が生じたために投稿させていただく運びとなりました。)
CHERRY

2022/04/02 12:26

コマンドライン時の REMOTE_ADDR って 何が入ることを想定しているのでしょうか? コマンドを実行したサーバーの IP アドレスですか?
hentaiman

2022/04/02 13:02

既に$_SERVERを基準の処理を作ってしまっているならスマートな方法は諦めるしかない
68user

2022/04/02 13:17

環境変数で渡せるっぽいですね。 $ REMOTE_ADDR=111.22.333.444 php x.php
68user

2022/04/02 13:27

「CGI 等のインタフェース経由で渡される情報をどこかのレイヤで切り離し、client とか request などのオブジェクトに押し込んでおく。テスト時はそのオブジェクトに適当な値を入れ、期待通りに動くか確認する」というのが理想形な気がしますが、多少汚くても楽できればいいじゃんという思想の PHP ですので (私見)、$_SERVER 更新しても別にいいんではと思います。
takenokonyokki

2022/04/03 04:44

CHERRY様 どんな値でもいいのですが、一応今回は$_SERVER 変数は「自分が今このChromeでアクセスした場合」のみを考えております。
takenokonyokki

2022/04/03 04:46

68user様 ありがとうございます。渡す方法があったのですね。助かりました。 確かに$_SERVER 更新した方が楽ですし、言われてみれば確かにPHPの思想にあった方法だという解釈もありですね。
hentaiman

2022/04/03 06:34

REMOTE_ADDRを上書きするのはどうかと。全くスマートではない対応ならそれでいいだろうけど。
guest

回答1

0

自己解決

「質問への追記・修正の依頼」にてご投稿頂きました68user様のコメントを、解決方法として以下に掲載させて頂きます。

68user
環境変数で渡せるっぽいですね。
$ REMOTE_ADDR=111.22.333.444 php x.php

コメント下さった皆様ありがとうございました。

投稿2022/04/03 04:48

takenokonyokki

総合スコア10

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問