51407
Amazon Linux で Apache/2.4.34 + PHP7.0.32 の環境で PHPSpreadsheet
を使ってExcelファイルをダウンロードしようとしています。  
しかし、ダウンロード以前にExcelファイルを作成するところで躓いています。

まず下記のようなコードを書きました、/var/www/html/test_server/test1.php  
ブラウザからアクセスされると、/home/ec2-user/ccc/hello.xlsx にExcelファイルが出力されるように意図しています。

・ディレクトリ構成

```

    /var/www/html/test_server/
                |- test.php
                |  (以下はPHPSpreadsheet関連)
                |- vendor/
                |- composer.json
                |- composer.lock
    
```

・test1.phpのソースコード

```

    <?php
    require 'vendor/autoload.php';
    use PhpOffice\PhpSpreadsheet\Spreadsheet;
    use PhpOffice\PhpSpreadsheet\Writer\Xlsx as XlsxWriter;
    
    $spreadsheet = new Spreadsheet();
    $sheet = $spreadsheet->getActiveSheet();
    $sheet->setCellValue('A1', 'Hello World !');
    
    $writer = new XlsxWriter($spreadsheet);
    $writer->save('/home/ec2-user/ccc/hello.xlsx');
    ?>
    
```

ブラウザから  
<http://ec2-xxx-xxx-xxx-xxx.ap-
northeast-1.compute.amazonaws.com/test_server/test1.php>  
にアクセスすると、下記のメッセージが表示されます。

・エラーメッセージ

```

    このページは動作していません 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 の内容を見てみました。

ブラウザから  
<http://ec2-xxx-xxx-xxx-xxx.ap-
northeast-1.compute.amazonaws.com/test_server/test1.php>  
でアクセスしたときのログは以下のようになっていました。

[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サーバーのユーザーはファイルを作れないということで、私のやろうとしていたことが根本的に間違っていることがわかりました。ご指摘、アドバイス、本当にありがとうございました。

この質問はクローズさせていただきます。
CC BY-SA 4.0
2018-12-12T09:35:39.060
51150
2019-01-06T10:48:20.143
2018-12-21T09:06:08.630
31416
31416
question
php apache excel amazon-ec2
ブラウザからのアクセス時、PHPSpreadsheetでExcelファイルを作成できない
keitaro_so 様

アドバイスありがとうございます。

/var/log/httpd/error_log の内容を見てみました。

ブラウザから  
<http://ec2-xxx-xxx-xxx-xxx.ap-
northeast-1.compute.amazonaws.com/test_server/test1.php>  
でアクセスしたときのログは以下のようになっていました。

[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.');
        }
    }
    
```
CC BY-SA 4.0
2018-12-20T08:19:23.923
51389
2018-12-20T08:19:23.923
31416
51150
answer
完全な回答となるか分かりませんが、気になった点を。

ブラウザ経由でPHPスクリプトを実行した場合、通常は **Webサーバのユーザー権限**
で実行されます。使用しているのはApacheなので、ユーザーも恐らく`apache`でしょう。

一方で、スクリプトの中でエクセルファイルの保存先は`ec2-user`のホームディレクトリ以下になっており、このディレクトリに対して`apache`ユーザーでのアクセス権限が無いと書き込みエラーになる可能性があります。  
(コマンドラインから実行した場合には`ec2-user`の権限なので正常に実行できているのでしょう)

```

    $writer->save('/home/ec2-user/ccc/hello.xlsx');
    
```

Webサーバが実行するスクリプトからアクセスする(エクセル)ファイルは、PHPスクリプトと同じディレクトリにしてみてはどうでしょうか？

```

    $writer->save('./hello.xlsx');
    
```

少なくとも、ドキュメントルート `/var/www/html` より上位ディレクトリにアクセスするのは、セキュリティ上も好ましくない気がします。
CC BY-SA 4.0
2018-12-21T03:59:38.060
51407
2018-12-21T03:59:38.060
3060
51150
answer
PhpSpreadsheetはコマンドラインでしか動かないようなのでPHPの[shell_exec](http://php.net/manual/ja/function.shell-
exec.php)でシェルスクリプトを実行してPhpSpreadsheetを動かせば可能です。  
[exec](http://php.net/manual/ja/function.exec.php)でも出来るんじゃないかと思いますが、自分がやった時には上手くいきませんでした。

とりあえずtest1.phpを(例)test1.shで実行するような形を作ります。

```

    #!/bin/sh
    /usr/bin/php test1.php
    
```

後はブラウザでアクセスするPHPファイルに

```

    shell_exec( "test1.sh" );
    
```

のように書いておけば動くはずです。

Amazon Linuxはよく知らないのでパス等は考慮してません。
CC BY-SA 4.0
2019-01-06T10:48:20.143
51756
2019-01-06T10:48:20.143
31683
51150
answer