質問: new XlsxWriter($spreadsheet); $writer->save('/home/ec2-user/ccc/hello.xlsx'); ?> ``` ブラウザから にアクセスすると、下記のメッセージが表示されます。 ・エラーメッセージ ``` このページは動作していません ec2-xxx-xxx-xxx-xxx.ap-northeast- 1.compute.amazonaws.com では現在このリクエストを処理できません。 HTTP ERROR 500 ``` ちなみに、/var/www/html/test_server/ ディレクトリで、 ``` php test1.php ``` とコマンド実行すると、/home/ec2-user/ccc/hello.xlsx が作成されました。 ブラウザでアクセスした時に、Excelファイルが作成できないのはなぜなのでしょうか? 私はLinuxにあまり詳しくありません。 どなたか、アドバイスをいただけないでしょうか。よろしくお願いします。 --- cubick 様にご指摘いただいたので、エラーログの内容をこちらに追記させていただきます。 --- keitaro_so 様 アドバイスありがとうございます。 /var/log/httpd/error_log の内容を見てみました。 ブラウザから でアクセスしたときのログは以下のようになっていました。 [Thu Dec 20 16:50:04.315576 2018] [:error] [pid 25466] [client xxx.xxx.xxx.xxx:xxxxx] PHP Fatal error: Uncaught PhpOffice\PhpSpreadsheet\Writer\Exception: Could not open /home/ec2-user/ccc/hello.xlsx for writing. in /var/www/html/test_server/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx.php:218\nStack trace:\n#0 /var/www/html/test_server/test1.php(11): PhpOffice\PhpSpreadsheet\Writer\Xlsx->save('/home/ec2-user/...')\n#1 {main}\n thrown in /var/www/html/test_server/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx.php on line 218 情けない事ですが、このエラーの意味も良くわかりません。 /home/ec2-user/ccc/hello.xlsx を書込み用に開けないと言っているようですが。 Webアクセスしてきたユーザー(と言っていいんでしょうか?)には、ファイル書込みの権限が無いとかでしょうか? 何かわかることがあれば、教えていただけるとありがたいです。 よろしくお願いします。 /var/www/html/test_server/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx.php on line 218 は、以下のようなコードになっていました。 ``` // Try opening the ZIP file if ($zip->open($pFilename, ZipArchive::OVERWRITE) !== true) { if ($zip->open($pFilename, ZipArchive::CREATE) !== true) { throw new WriterException('Could not open ' . $pFilename . ' for writing.'); } } ``` --- アドバイスを下さった、keitaro_so様、cubick様、ありがとうございました。 そもそも、Webサーバーのユーザーはファイルを作れないということで、私のやろうとしていたことが根本的に間違っていることがわかりました。ご指摘、アドバイス、本当にありがとうございました。 この質問はクローズさせていただきます。
回答: PhpSpreadsheetはコマンドラインでしか動かないようなのでPHPのshell_execでシェルスクリプトを実行してPhpSpreadsheetを動かせば可能です。 execでも出来るんじゃないかと思いますが、自分がやった時には上手くいきませんでした。 とりあえずtest1.phpを(例)test1.shで実行するような形を作ります。 ``` #!/bin/sh /usr/bin/php test1.php ``` 後はブラウザでアクセスするPHPファイルに ``` shell_exec( "test1.sh" ); ``` のように書いておけば動くはずです。 Amazon Linuxはよく知らないのでパス等は考慮してません。