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

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

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

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

PHP

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

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Windows Server

Windows Serverとは、Microsoft社のサーバ用オペレーティングシステムの総称です。 企業内ネットワークなどで利用されるサーバ機へ導入することを想定して開発されているため高い安定性があり、 管理機能を提供するソフトウェアが多く含まれています。

Q&A

解決済

3回答

1501閲覧

WEBアプリ 別のphpをバックグラウンドで実行させたい

sh1009

総合スコア10

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

PHP

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

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Windows Server

Windows Serverとは、Microsoft社のサーバ用オペレーティングシステムの総称です。 企業内ネットワークなどで利用されるサーバ機へ導入することを想定して開発されているため高い安定性があり、 管理機能を提供するソフトウェアが多く含まれています。

0グッド

1クリップ

投稿2018/09/18 14:00

編集2018/09/18 14:13

WINDOWS SERVER、SQLserver、phpで開発しています。

独学でやっているため専門用語があまり分かりませんがよろしくお願いします。

現在、数百件宛てにメールを送信したく、バックグラウンドでmail.phpを実行出来ればと思っております。

index.phpに送信ボタンを設置しmail.phpをバックグラウンド(非同期)で実行。
ブラウザが閉じられてもmail.phpが終了するまで処理実行。
処理完了後にmail.phpは閉じる。という流れです。

以下index.php・mail.phpは同じディレクトリに配置

<?php index.php <form action=''> <input type='submit' value='送信' /> </from> ?> <?php mail.php $stmt = sqlsrv_query($conn, $SQL); while($row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC)){ mail($row['to'],$row['from'],$body,$header); } ?>

いろいろ調べて試しましたが以下の関数など見つけましたが動作せず質問となりました。
exec("nohup php -c '' 'mail.php' > /dev/null &")、
popen(’start mail.php’,'r');pclose($fp);
など試しました。

なお、スパムメール扱いにされてしまう可能性などは、複数回に分けてsleepも加えつつ対処していこうとは思っておりますが、何か気をつけるべきことなど有れば合わせてご教授頂けると幸いです。

以上よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

PHPで他のPHPを実行する方法をお教えください
にあるように、phpとmail.phpをフルパスで指定して試してみください。

そのうえで、popen()で実行してあげれば動くと思います。

なお、スパムメール扱いにされてしまう可能性などは、複数回に分けてsleepも加えつつ対処していこうとは思っておりますが、何か気をつけるべきことなど有れば合わせてご教授頂けると幸いです。

気を付けることは山ほどありますが、
内容がスパムっぽく無いこと、SPFレコードとDKIMの設定が正確にされていること
辺りは注意しないと高確率でスパム扱いされますね。

投稿2018/09/18 17:54

tanat

総合スコア18713

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

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

sh1009

2018/09/19 09:21

回答ありがとうございます。 samuraidersさんの返事にも書いたとおり、引数の記述をいくら変えてもmail.phpが実行できません。 SPFレコードとDKIMの設定 こちらは初めて聞く言葉でしっかり調べてから取り掛かろうと思います。 なにか記述に不備や間違いが分かればご教授いただけると幸いです。
tanat

2018/09/19 11:08

PHPマニュアル http://php.net/manual/ja/function.popen.php の返り値 のあたりを参照してエラーを取得してみて下さい。 多分、単純にパスの書き方が間違っていて実行できていないんだと思います。 $fp = popen("start C:\php\php.exe E:\http\mail\mail.php","r"); みたいな感じな気がします。
guest

0

基本的にはsubmitをクリックされた段階でリクエストは渡されているはずなので、ブラウザを閉じても異常終了やタイムアウトしない限りメール配信は続くと思います。

他の方法としては、submitしたタイミングでDBに配信予約のデータを入れておき、cronで配信予約があれば配信するなどの処理がいいかなと。

スパムについてはあまり詳しくないですが、同一IPで大量配信するとIPが汚れますし、エラーとなるアドレスに対して大量に配信しても同様です。
メール配信は問題が起こりやすいところでもあるので、Amazon SESを使うのも一つの手かと思います。

投稿2018/09/18 16:56

samuraiders

総合スコア63

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

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

sh1009

2018/09/19 09:16

ご回答いただけた内容をもとに下記のように修正してみました。 tantaさんの回答にあるとおり、フルパスで記述してみました。 if($_POST['send']){ $fp = popen("start C:/php E:/http/mail/mail.php","r"); pclose($fp); echo "到達しました。"; } として試していますが、一向に反応がありません。 もちろんリクエストは渡ってきております。 echo "到達しました。" も列挙されます。 popen()の引数の書き方が何が正しいのかが分かりません。 サイトごとにphpファイルをシングルクォーテションでくくっていたりいなかったり... startの後に ’’ や /b などの記述があったり... いずれも試してはみましたが一向にphpファイルが実行されません。 php本体はCドライブの直下、C:/php に配置 phpファイルは、E:/http/mail/mail.php に配置 ブラウザ上で、URL/mail.php を表示、実行してみると、mail.phpは問題なく動作しております。 あと試すべきことなにかあればご教授いただきたいです。 サーバーでのcronの情報ありがとうございます。 こちらは、サーバーの知識に乏しいため、次回以降設計の段階で考えてみたいと思います。
taka-saan

2018/09/19 09:46

> php本体はCドライブの直下、C:/php に配置 なのであれば、 × start C:/php E:/http/mail/mail.php ○ start C:/php/php E:/http/mail/mail.php では?
sh1009

2018/09/19 10:04

やはり反応ないです^^; もしかしてphp.iniの設定やPHP本体へのアクセス権限など関係あるのでしょうか? もし分かればご教授くださいm(__)m
sh1009

2018/09/19 10:08

ちなみに C:/PHP/phpだと php.exe php.gif php.ini が存在しており、念のため start C:/PHP/php.exe E:/http/mail/mail.php としてみましたが、こちらもダメでした
taka-saan

2018/09/19 10:24

C:\PHPというディレクトリにその3つのファイルしかないという状況ですか? PHPをインストールしたディレクトリには他にもDLLなどが多数あると思うのですが、そうであればそれらも一緒にそこに無いとだめですよ。
sh1009

2018/09/19 10:49

phpというファイルの名前が3つでした。 それ以外は正常に入っております。 とりあえず、php.iniの設定が原因でした^^; とはいえ、記述方法がわかり大変たすかりました。 また何かあった時はよろしくお願いいたします。
guest

0

自己解決

無事に動作いたしました。

php.ini
でpopenが利用できないように設定されておりました。

disable_functions = phpinfo, eval, system, exec, passthru, popen...

popenを外したところ正常に動作いたしました。
お騒がせいたしました。

投稿2018/09/19 10:21

sh1009

総合スコア10

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問