- ベストアンサー
PHPのexec()関数の使い方
お世話になります。 PHPのexec()関数を使って、Windows Media Player で音楽ファイルを再生することを考えています。 プログラムを書く前に実際の動作で再生できるかをチェックするために、コマンドウィンドウを立ち上げてみましたら、プロンプトは次のようになっていました。 C:\Users\User> そこから次のような順でコマンドを手入力し、実際に音楽を再生できました。 C:\Users\User>cd c:/ C:\>cd program files (x86) C:\program files (x86)>cd windows media player C:\program files (x86)>windows media player>wmplayer "D:\ORIGINAL_SONGS\02000 荒井由美 青江三奈 渥美二郎 伍代夏子\2200 荒井 渥美 チェッカーズ 青江 梓\2230 荒井由美\2233 荒井由実 瞳を閉じて.avi" "D:\ORIGINAL_SONGS\..." の部分は音楽ファイルのパスです。 PHPプログラムはlocalhost の root である htdocs にありますが、音楽データはD:ドライブに格納してあります。 この実際の作業をPHPのスクリプトで書いてみたのが次のようなものです。 <?php $rootpath="D:/"; $songpath= "ORIGINAL_SONGS/02000 荒井由美 青江三奈 渥美二郎 伍代夏子/2200 荒井 渥美 チェッカーズ 青江 梓/2230 荒井由美/2232 荒井由実 中央フリーウェイ.avi"; exec("cd c:/"); exec("cd c:/program files (x86)"); exec("cd windows media player"); exec("wmplayer "."'".$rootpath.$songpath."'"); ?> これで音楽が始まるものと期待しましたが、何も始まりません。 コマンドウィンドウを見ても、最初の C:\Users\User> のままでした。 始めてやってみているので何が問題なのかわかりません。 どなたか詳しい方がいらっしゃいましたら、アドバイスいただけると嬉しいです。よろしくお願いいたします。
- みんなの回答 (10)
- 専門家の回答
質問者が選んだベストアンサー
startコマンドの第1引数はウインドウのタイトルで、省略可能なのですが、第2引数のプログラムパスを "" で囲むとタイトルと見なされる仕様です。 なので下記のように指定します。 start "" "C:\program files (x86)\windows media player\wmplayer.exe" あとstartコマンドにはウインドウのサイズを指定できますので、これと再生の引数を入れて start /max "" "C:\program files (x86)\windows media player\wmplayer.exe" "%~1" としてみましょう。 呼び出し側は引数を "" で囲んでください。 また、動画パス指定時の \ は \\ にしてください。 exec("batch-test1.bat \"$songpath\""); 試しにXAMPPをインストールして実行してみましたが、自分の環境だと、メディアプレーヤーはアイコン化せず普通に起動しますね。原因はわかりかねます。
その他の回答 (9)
- agepage
- ベストアンサー率27% (39/143)
<?php #テスト環境:Windows10 php8 #これでメディアプレイヤーでd:にあるmedia.mp4が再生されました $wmplayer = "C:\PROGRA~2\WINDOW~4\wmplayer.exe"; $medias = "D:\media.mp4"; exec("$wmplayer $medias"); /* php8の場合の注意事項 スペースを含むパスで指定すると失敗した そのために「短い名前」で指定する必要がある 質問にあるパスもダメだと思う 短い名前はコマンドプロンプトでその階層でdir /xを行うと表示される https://engrmemo.jp/win/win10-short-filename/ この辺りの意味が分からない場合は、aviファイルをスペースを含まない階層に保存してみてください */
お礼
ご回答ありがとうございます。 また、お礼が遅れたことをお詫びいたします。 繰り返しになりますが、せっかくアドバイスをいただきましたが、回答番号8番の方のアドバイスにより、問題は解決いたしました。 悪しからずご了承ください。 またいつか助けていただけると有り難いです。
- agepage
- ベストアンサー率27% (39/143)
週が明けましてやっとWindows端末が触れるようになりました #PHP5でこれでメディアプレイヤーを起動できました <?php exec("C:\Program Files (x86)\Windows Media Player\wmplayer.exe"); #PHP8でこれでメディアプレイヤーを起動できました #ただしこれは利用者によってパスが変わると思います。 #短いパスの調べ方(dir /x)で場所を適宜あなたの環境で直してください <?php exec("C:\PROGRA~2\WINDOW~4\wmplayer.exe"); まずはここまでできるか教えてください
お礼
ご回答ありがとうございます。 また、お礼が遅れたことをお詫びいたします。 せっかくアドバイスをいただきましたが、回答番号8番の方のアドバイスにより、問題は解決いたしました。悪しからずご了承ください。 またいつか助けていただけると有り難いです。
- luka3
- ベストアンサー率72% (452/621)
>最大実行時間の120秒を経過した exec関数がプレイヤーの終了を待ち続けているためです。 別ウインドウで起動するようにすればいいです。 exec("start \"\" \"C:\\program files (x86)\\windows media player\\wmplayer.exe\" \"D:\\ORIGINAL_SONGS\\02000 荒井由美 青江三奈 渥美二郎 伍代夏子\\2200 荒井 渥美 チェッカーズ 青江 梓\\2230 荒井由美\\2233 荒井由実 瞳を閉じて.avi\""); アイコン化状態で起動する理由はわかりません。 あとは、execに書いたコマンドをバッチファイルにして、execからはそのバッチファイルを呼び出すとどうでしょう。 (解決しない場合) phpはwebサーバで使っていますか? webサーバはapacheでサービスとして登録されていますか?
お礼
ご回答ありがとうございます。 メディアプレイヤーのパスの前に "start \"\ を追加してみました。 タスクバーにメディアプレイヤーのアイコンが表示されることは変わりませんが、それをクリックした時に現れる画面はフルスクリーンとなりました。 次にバッチファイルを利用する件ですが、次のようなバッチファイルとPHPスクリプトを書いてやってみました。 バッチファイル:batch-test1.bat @echo off start "C:\\program files (x86)\\windows media player\\wmplayer.exe" PHPスクリプト:batch-test1.php <?php $songpath = "D:\EXTRA_SONGS\Japanese-songs\「春なのに」柏原芳恵(川栄李奈).mp4"; exec("batch-test1.bat $songpath"); ?> これで出てきたのは、メディアプレイヤーのウィンドウに以下の様な内容のコマンドプロンプトです。 Microsoft Windows [Version 10.0.19045.5131] (c) Microsoft Corporation. All rights reserved. C:\xampp\htdocs\karaoke> バッチファイルへの曲名変数の渡し方がおかしいのでしょうか? また、Webサーバーについてのご質問ですが、xampp のapache を使っていますが、サービスとしてではありません。
- dell_OK
- ベストアンサー率13% (776/5747)
回答No.4です。 私の案ではなかったようですが、解決したようなのでよかったです ちなみに変数に代入しているところの " で括ったファイルパスを、さらに ' で括っていることに気づいてくださっていたでしょうか。 " をエスケープして書くと読みにくくなると思って ' で括っています。
お礼
ご回答ありがとうございます、お礼が遅れたことをお詫びいたします。 私はカナダのブリティッシュ・コロンビア州のバンクーバー島に住んでいるため、時差のために生活時間帯が日本と異なり、お礼が遅くなることがあります。ご容赦ください。” をさらに ’ でくくってあることには気づいていました。 他の回答者さんからのパスの書き方で一応メディアプレイヤーでの再生に成功しました。タスクバーにアイコンが現れ、それをクリックしてスクリーン上に表示することになります。 家族で楽しむカラオケシステムとしては、これでも十分なのですが、出来ればメディアプレイヤー自体がスクリーンに現れるともっといいかなと考えています。
- luka3
- ベストアンサー率72% (452/621)
exec("\"C:\\program files (x86)\\windows media player\\wmplayer.exe\""); まず、これでプレイヤーが起動するか 起動するなら下記で再生できるでしょうか exec("\"C:\\program files (x86)\\windows media player\\wmplayer.exe\" \"D:\\ORIGINAL_SONGS\\02000 荒井由美 青江三奈 渥美二郎 伍代夏子\\2200 荒井 渥美 チェッカーズ 青江 梓\\2230 荒井由美\\2233 荒井由実 瞳を閉じて.avi\"");
お礼
ご回答ありがとうございました。また、お礼が遅れたことをお詫びいたします。 ビデオの再生に成功しました。これで大きな山場を超すことができました。感謝でいっぱいです。 しかしながら、メディアプレイヤーはPCの画面にオープンするのではなく、タスクバーにアイコンが表示される形です。そのままでも音楽は聴けますが、動画を見るにはそのアイコンをクリックし、サイズを変更しなくてはなりません。また「最大実行時間の120秒を経過した」といったような英語のエラーメッセージも出ました。 実は私は趣味の家庭用カラオケシステムを作っています。 多数のカラオケ曲のデータがあるのですが、その殆どが avi フォーマットで、mp4 などと違ってHTMLの <video> タグでは再生できません。このフォーマットのファイルはMedia Player で再生できると分かったので、PHP のexec()関数を使うことを思いついたわけです。 もしご存知でしたら、直接PC画面に表示させる方法やサイズの変更をPHPスクリプト内で行う方法についても教えていただけると有り難いです。もしその様な事が出来ないのであれば、自分の手で行うカラオケシステムという事にしますが。
- dell_OK
- ベストアンサー率13% (776/5747)
これではどうでしょうか。 $playerpath = '"c:/program files (x86)/windows media player/wmplayer"'; $song = '"D:/ORIGINAL_SONGS/02000 荒井由美 青江三奈 渥美二郎 伍代夏子/2200 荒井 渥美 チェッカーズ 青江 梓/2230 荒井由美/2232 荒井由実 中央フリーウェイ.avi"'; exec($playerpath . ' ' . $song);
お礼
ご回答ありがとうございます。 exec($playerpath . ' ' . $song); でやってみましたが、うまくいきませんでした。 自分がコマンドラインから手入力したときには、曲名の全パスを引用符(”)で囲んで出来たので exec($playerpath . ' ' ."'". $song."'"); にしてみましたが、これもうまくいきません。 また何か別のアイデアがお有りでしたらお知らせください。
- agepage
- ベストアンサー率27% (39/143)
もうひとつ $playerpath = "cd c:/program files (x86)/windows media player/wmplayer"; これ、最後は.exeになるはず 手元にWindowsないけどこのファイル名はおかしいと思う これで試して $playerpath = "c:/program files (x86)/windows media player/wmplayer.exe";
お礼
ご回答ありがとうございます。 自分が手入力でコマンドを実行した時は、exe は省略しても働きました。 $playerpath = "c:/program files (x86)/windows media player/wmplayer.exe"; でやってみましたが、出来ませんでした。 また何かいいアイデアがあれば教えていただけると有り難いです。
- agepage
- ベストアンサー率27% (39/143)
$playerpath = "cd c:/program files (x86)/windows media player/wmplayer"; ↑ cdが不要、c:から始まる $song= "D:/ORIGINAL_SONGS/02000 荒井由美 青江三奈 渥美二郎 伍代夏子/2200 荒井 渥美 チェッカーズ 青江 梓/2230 荒井由美/2232 荒井由実 中央フリーウェイ.avi"; ↑ ファイルを一つだけフルパスで記載 とりあえずそれで試して うまくいったら、全てのファイルをフルパスで記載
- agepage
- ベストアンサー率27% (39/143)
1:プログラムまでのバスをひとつにしてください 2:再生したいファイルもフルパスで一つにしてください $player="メディアプレーヤーのフルパスと実行ファイル名": $file1="再生したいファイルをフルパス": exec("$player $file1"): ※スマホで回答しています、:などは適宜直してください
お礼
早速のご回答、有難うございます。 次のように修正してみましたが、期待されていない変数$songがあるとのエラーメッセージが出ました。 <?php $playerpath = "cd c:/program files (x86)/windows media player/wmplayer"; $song= "D:/ORIGINAL_SONGS/02000 荒井由美 青江三奈 渥美二郎 伍代夏子/2200 荒井 渥美 チェッカーズ 青江 梓/2230 荒井由美/2232 荒井由実 中央フリーウェイ.avi"; exec($playerpath $song); ?> そこで次のようにもしてみましたが、何も表示されません。またコマンドウィンドウも元のままです。 $command = $playerpath." '".$song."'"; $exec($command); ちなみにコマンドウィンドウは初めから開けておいた方がよいのでしょうか?閉めたままでもよいのでしょうか?
お礼
ご回答ありがとうございます。 今回頂いたアドバイスにより、画面上フルスクリーンで音楽ファイルを再生できました。やはり曲の変数を渡す方法が分かっていませんでした。これで本来の希望であった事が実現できます。 貴重なお時間を費やしてお付き合いいただき、本当にありがとうございました。