🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

PHP

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

Q&A

解決済

1回答

1437閲覧

PostgreSQLのリストア外部コマンドをPHPで実行するとき何も書き込まれない

wakaranchin

総合スコア15

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

PHP

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

0グッド

2クリップ

投稿2020/08/21 01:14

編集2020/08/21 02:28

前提・実現したいこと

PostgreSQLのリストアをPHPから実行できるようにしたいのですが上手くいきません。

発生している問題・エラーメッセージ

shell_exec()のエラーメッセージを出そうと思いソースコードのように書いているのですが何も表示されません。
私の書き方が悪いのでしょうか。エラーメッセージや実行結果などの返り値の見方も教えていただきたいです。

該当のソースコード

PHP

1<?PHP 2$restoredate = filter_input(INPUT_POST, 'date'); 3$cmd = 'USER="postgres" 4DBNAME="restoretest" 5 6 7dropdb -U $USER $DBNAME 8 9createdb -U $USER $DBNAME 10 11psql -U $USER -d $DBNAME -f "/var/backup/project-20200820.sql" 12 13exit $?'; 14 15$message = shell_exec($cmd ); 16echo $message; 17?>

psql -U $USER -d $DBNAME -f "/var/backup/project-20200820.sql"のところだけ上手くいきません

試したこと

db削除(dropdb)、作成(createdb)のみで行うと正常に実行されるのでpsql -U $USER -d $DBNAME -f "/var/backup/project-20200820.sql"の部分だけ動いていないと思うのですがどこがおかしいのでしょうか。

この外部コマンドをシェルファイルにし、実行しても上手くいくのですがPHPでの雇用に書いた場合エラーになってしまいます。

補足情報(FW/ツールのバージョンなど)

linux:CentOS Linux release 8.2.2004 (Core)
php:PHP 7.2.24
psql (PostgreSQL) 10.14

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

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

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

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

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

showkit

2020/08/21 01:56

予測で言いますが、「$USER」「$DBNAME」は、PHP 越しに実行するときには 展開されていないのではありませんか?
wakaranchin

2020/08/21 02:02 編集

dropdb、createdbでも「$USER」「$DBNAME」使って動作しているのですがpsqlでは展開されないということもあるのでしょうか…? 一応「psql -U postgres -d restoretest -f "/var/backup/project-20200820.sql"」という書き方もしてみたのですが上手く書き込まれませんでした。
showkit

2020/08/21 02:10

勘違いしていたら ごめんなさい。dropdb, createdb は、成功しているのですか? dropdb だけ やってみて そのあと、ほんとに その データベースはなくなっていますか?
wakaranchin

2020/08/21 02:26

自分の書き方が分かりにくくてすみません。 削除、作成は確認できたのですがデータを入れることだけができない状況です。 linuxサーバー上でも「psql -U postgres -d restoretest -f "/var/backup/project-20200820.sql」と打ち込むとデータが入るのですがPHPで質問のように書き込むと何もデータが入っていない状態になってしまいます。
退会済みユーザー

退会済みユーザー

2020/08/21 04:09

dropdbやcreatedbやpsqlなどのコマンドはApacheでモジュールとして動作中のphpから呼び出せる権限がついているのかどうか。SELinuxが有効だと呼び出せるようにフラグを設定しておかなきゃいけなかった気がしますし、そうでなくてもオーナーやグループの権限まわりはWeb Apache向けとPostgreSQLとでは初期で違っているので何かとややこしそうな気がします。
退会済みユーザー

退会済みユーザー

2020/08/21 04:17

web越しにダンプファイルを反映する、とか、インターネット上に晒しているサーバーではやらないほうがいいよ。セキュリティの穴を突いて第三者にいたずらされることも想定してほしい。HTTPSを使いつつBASIC認証を必須にするなどしても、心配のタネは尽きない。ダンプファイルを反映するだけなら、SSH経由でリモート接続して、コマンドを叩くとかシェルスクリプトを動かすなどの、間違いないやり方を面倒臭がらずにやるべきかと。(説教臭くてスマン)
wakaranchin

2020/08/21 04:25

サーバーをあまり触ったことがない者が利用する予定のシステムだったのでわかりやすくwebで…と思っていたのですがやはりセキュリティ的に厳しいんですね。簡単な動作ですしダンプファイルの反映はそんなに頻繁にしないと思うのでサーバーに直接コマンドを入力したほうがいいかもですね。
退会済みユーザー

退会済みユーザー

2020/08/21 04:29

後半の、SSH経由でリモート接続してシェルスクリプトを動かす、っていうのも、 telnetクライアントソフト次第ではそれ自体をマクロコマンドで動かすこともできたりして、 都度コマンドを叩かなくても済む程度に簡略化はできます。 (Windows上ではTera Termでよくやった。)
wakaranchin

2020/08/21 04:34

自分も今teratermを使用してリモート接続でサーバーの操作をしていて、そこではダンプファイルの反映なども上手くいっているのでバックアップの呼び出しなどはwebのほうではなくこっちの方法でやっていこうと思います。コメントありがとうございました。
guest

回答1

0

ベストアンサー

シェルスクリプトは 使わない、変数化したいということで・・・。

php

1<?PHP 2$user = 'postgres'; 3$dbname = 'restoretest'; 4$sql = '/var/backup/project-20200820.sql'; 5 6$message = shell_exec("dropdb -U $user $dbname"); 7echo $message; 8 9$message = shell_exec("createdb -U $user $dbname"); 10echo $message; 11 12$message = shell_exec("psql -U $user -d $dbname -f $sql"); 13echo $message; 14?>

では、いかが?
わたしの環境では、うまくいきました。

投稿2020/08/21 02:54

編集2020/08/21 03:50
showkit

総合スコア1638

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

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

wakaranchin

2020/08/21 03:04

シェルスクリプトを作成して実行という方法は試していて出来たのですが、PHPでsqlファイルの部分に変数を入れて実行したく、コマンドをわざわざPHPに書いていました。 シェルスクリプトの文の中にPHPの変数を入れるっていうことも出来たりしますでしょうか・・・? webシステムを作っておりまして現在は固定のファイルを入力していますがここから任意のファイルをDBに書き込むということをしたかったです。また質問の情報不足で申し訳ありません…
showkit

2020/08/21 03:50

回答更新しましたが、いかがでしょうか?
wakaranchin

2020/08/21 04:17

自分の環境ではやはり前回までと同じく、このプログラムでもデータベースの「作成」、「削除」の確認はできたんですがsqlファイルの割り当てだけ上手くいきません…サーバーに直接「psql -U postgres -d restoretest -f /var/backup/project-20200820.sql」と書き込めば上手くいきますしコマンドもsqlファイルのディレクトリも間違ってはいないはずなのですが・・・php側の設定かなにかを変えなければいけないんですかね…
showkit

2020/08/21 04:21

最後のコマンドを変数化せずに、「psql -U postgres -d restoretest -f /var/backup/project-20200820.sql」にしても同様の結果ですか?
wakaranchin

2020/08/21 04:28

やはり反映されてないです。echo $message;で出力を促してると思うんですがここは何か出力されますか?自分の環境だと3つとも何も表示されないのですが・・・
showkit

2020/08/21 04:32

上の2つは、何も表示されません。最後の行は コマンドで、psql を実行したときと同じ 表示が出力されます。
wakaranchin

2020/08/21 04:41

色々試してみたのですがやっぱり上手く行かないです… webでのダンプファイルの反映はあまり好ましくないというご指摘もいただいたのでバックアップの呼び出しはサーバー操作でやっていこうかなと思っています。わざわざソースコード、検証などまでしていただいたのに申し訳ないです。
showkit

2020/08/21 04:44

いえいえ、psql を php から動かすのはやったことがなかったので、新しい知識が増えました。頑張ってくださいね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問