PHP：SSH接続できないレンタルサーバーでコマンドを実行する

# はじめに
自分が使用しているレンタルサーバーは「さくらのレンタルサーバのライトプラン」で、SSH接続ができない仕様となっています。
なんとかコマンド実行できないか調べたところ、PHPのexec関数を使えば可能だったので、手順についてまとめます。

![さくらのレンタルサーバプラン比較](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230850/06202a47-bb4d-2df6-c6ac-238948f8e3fc.png)
出典：[プラン比較 - レンタルサーバーはさくらインターネット](https://rs.sakura.ad.jp/plans.html)

# 環境
PHPがはいっていることが前提となります。
* サーバー：[さくらのレンタルサーバ - ライトプラン](https://rs.sakura.ad.jp/lite.html)
* PHPのバージョン：8.1.20

# 手順
1. phpファイルを作成し、次のようなスクリプトを記述する（`$command`変数に実行したいコマンドを記述する）

	```php
	<pre>

	<?php
	$command = 'php -v';
	exec($command . ' 2>&1', $output, $result);

	echo '実行したコマンド：' . $command . '<br>';
	echo '結果：' . $result . '<br>';
	print_r($output);
	?>

	</pre>
	```

1. 作成したphpファイルをFTPなどを用いてレンタルサーバーへアップロードする

1. ブラウザから、phpのファイルのパスを指定すると、コマンドが実行される
	![php -v](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230850/ec3d1c09-7a38-ea2f-5c1a-26a2ba67faf9.png)

	結果のあとの番号が0なら成功、0以外なら失敗しています。
	番号の内容についてはこちらを参考にしてください。
	[Exit Codes With Special Meanings](https://tldp.org/LDP/abs/html/exitcodes.html)

# 具体例：Composerコマンドを実行する例
PHPのライブラリ管理ツール「Composer」を使ってライブラリをインストールしたいが、サーバーへSSH接続できない場合の方法です。

1. [Composer](https://getcomposer.org/download/)のサイトから、phpではじまる4行のスクリプトをコピーし、ローカル端末の任意のパスでコマンドを実行する

	```batch
	php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
	php -r "if (hash_file('sha384', 'composer-setup.php') === 'e21205b207c3ff031906575712edab6f13eb0b361f2085f1f1237b7126d785e826a450292b6cfd1d64d92e6563bbde02') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
	php composer-setup.php
	php -r "unlink('composer-setup.php');"
	```
	
	※スクリプトは更新されるようなので、サイトから最新のスクリプトをコピーしたほうがよさそうです

1. コマンドを実行したパスに「composer.phar」が作成されていることを確認する

1. 作成した「composer.phar」をFTPなどを用いてサーバーの任意のフォルダーへアップロードする

1. 次のスクリプトを記載したPHPファイルを作成し、サーバーの「composer.phar」と同じ階層へアップロードする

	```php
	<pre>

	<?php
	$command = 'export HOME="/root"; php composer.phar';
	exec($command . ' 2>&1', $output, $result);

	echo '実行したコマンド：' . $command . '<br>';
	echo '結果：' . $result . '<br>';
	print_r($output);
	?>

	</pre>
	```

1. ブラウザから、phpのファイルのパスを指定すると、コマンドが実行される

1. 「結果：0」が表示され、Composerのロゴが表示されていることを確認する
	![実行結果](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230850/88824cbe-2c61-1a4d-8631-eadf45041dfd.png)

	この画面が返ってくれば、Composerコマンドが使用できる状態です

phpファイルの`$command`の内容に、ライブラリを記載して実行すれば、ライブラリをインストールできます。

*  twitteroauthをインストールする例

	```php
	<pre>

	<?php
	$command = 'export HOME="/root"; php composer.phar require abraham/twitteroauth';
	exec($command . ' 2>&1', $output, $result);

	echo '実行したコマンド：' . $command . '<br>';
	echo '結果：' . $result . '<br>';
	print_r($output);
	?>

	</pre>
	```

「結果：0」が表示され、「composer.json」「composer.lock」ファイルと、「vendor」フォルダの中にabraham/twitteroauthのファイル群が作成されていればインストールは完了です。

# おわりに
SSH接続できないレンタルサーバーで、Composerコマンドを使ったライブラリのインストール方法がわからず、かなりハマってしまいました。
が、結果的にはComposer経由でライブラリをインストールする必要はなかったので無駄作業になってしまいました。
供養の意味もこめて手順をまとめました。誰かの役に立ちますように…。

# 出典
* [【PHP】逆引き！Composer コマンド・ライン一覧 と 基礎知識 - Qiita](https://qiita.com/KEINOS/items/86a16b06af6e936a1841)
* [SSH使用不可レンタルサーバーでComposerを使う方法 | Tanidaizのプログラミング備忘録・日記](https://tanidaiz.com/ssh使用不可レンタルサーバーでcomposerを使う方法/)