「PHPStorm」タグアーカイブ

【PHPStorm】FTPアップロードでタイムスタンプが更新できないエラー

PHPStormのFTPアップロードで

Failed to change timestamp of the file ‘xxxxxxx’

というエラーが表示されることがありました。

詳細なログをみてみると

org.apache.commons.vfs2.FileSystemException: Could not set the last modified timestamp of “sftp://xxxxxxxxxxxxxxxxxxxxx”.

ちなみに詳細なログをとるには、Help>Configure Debug Log Settingsのリストにcom.jetbrains.plugins.webDeploymentを加えると、Help>Show Log in FinderでDeproymentに関するログが見ることが出来るようになります。

ログみてもよくわからなかったのですが、どうもMDTMコマンドにサーバーが対応していないとか、そんな問題らしいです。深くは調べてないです。

エラーをなくすには、Tools>Deproyment>OptionsPreserve files timestampsのチェックを外すといいです。

参考:FTP: support UTIME commands to change files timestamps (MFMT or MDTM currently used)

 

【PHPStotm】FTPのアップロード・同期化の設定

PHP開発環境統合エディタのPhpStorm、とってもいいですね!JavaScriptの開発にもPHPの開発にも重宝しています。
今までEclipseNetBeansなどのIDEは重すぎる割りに使いこなすのが難しく使えていなかったのですがPHPStormはストレスを感じることなく使えています。
日本語化がされていない、有料ソフト、といった事で躊躇もありましたが今年の買って良かったNo.1ですよ。

気に入っているのはFTP/SFTPを使ったファイルアップ機能です。
自分は開発中に実際のサーバーにアップロードしながら確認するタイプなので、編集即FTPアップロードは自分にとっては必須です。
PHPStormは自動でアップロードしてしかも最新ファイルを上書きしないようにできるのです。

リモートサーバーの設定

まずプロジェクトを作ったらToolsメニューからDeproyment>Configuration…を選び、FTPの設定をしましょう。
この辺はいろんなところで書かれてあるので割愛。こことか。
ポイントはMappingタブでドキュメントルート以下を扱う場合でもしっかりサーバーのドキュメントルートとWEBルートに”/”を入れておくこと。
Mappingを指定しておかないと同期化できません。

一番右のRemoteHostをクリックするかTools>Deployment>Browse Remote Hostでサーバー上のファイルが見えるようになっていればまずはFTPの設定はOK。

Automatic Uploadの設定

次にファイル編集を保存すると同時にFTPにアップロードされるようにします。
ToolsメニューからDeproyment>Automatic Uploadにチェックを入れるだけです。

ファイルを保存するとFTPのログにアップロードされたと出てきます。もしファイルパーミッションなどで失敗していればちゃんとログで分かるのでチェックしてみてください。

2014年6月14日追記:

PHPStormは保存せずに終了したとき、一定時間操作しなかった時など自動でファイルを保存します。そのため、予期しないタイミングでサーバーにアップロードされることがありますので場合によってはAutomatic Uploadを有効にしない方がいい時もあります。

2014年10月6日追記:

PHPStormから別のアプリケーションに切り替えた時にも自動でセーブされるようです。だから意図していない時によくあがってしまうんですね。Deproyment>Options…のUpload changed files automatically to the default serverをAlwaysにしていればセーブと同時に常にアップロードも行われますがOn explicit save actionにしていれば明示的にセーブした時だけ、Neverにすればアップロードは行われません。
感覚的にはセーブした時だけアップロードするのが良さそうなのですが、後で説明するPHPStorm以外のアプリで作ったファイルの同期がセーブしたタイミングで行うようになるので、そっちの方はAlwaysの方が断然分かりやすいんですよね。
共同しているサーバーだとAutomaticUploadは使わず、自分だけのサーバーに常に同期する設定にして開発し、Gitなどで共同サーバーに反映させるのがいい気がします。

アップロード前に自動でチェック

自動でアップロードしていると、サーバー上のファイルが最新だった場合、上書きして消してしまうこともあります。

そこでToolsメニューからDeproyment>Options…を選び、ダイアログのWarin when uploading over newer file:を設定しましょう。
チェック種別を選んでNotyfy about remote changesにチェックを入れておきます。

これでFTP上のファイルと比較を行い何かが違っていたらダイアログでどうするか聞いてくるようになりました。

フォルダ以下を同期化する

ちなみにAutomatic Uploadを使っているとあまり使うことがないのですがファイル・フォルダ以下を同期化することもできます。
ローカルのプロジェクトのファイルやフォルダを右クリックしてDeproyment>Sync with Deployed to … を選択します。
比較のダイアログがでてきて、ローカルとリモートで差のあるファイルの一覧がでます。
しかも選択すればdiffの内容が分かりやすく表示され、どちらを残すかもファイルごとに選んで一括処理できるんです、すごい。
ただし、どちらかに無いファイルについては比較が行われないぽいです。

あれは出来ないのかな?

NetBeansだと、フォルダに画像ファイルを放り込んだだけで自動でFTPアップロードしてたんですけど、Phpstormでは出来ないのかな?まだ見つけられてません。

2014年6月14日追記:

ここみてたらありました。
[Preferences] – [Deployment] – [Options] – [Upload external changes]
で出来ました!ファインダーにファイルを放り込んだり、移動したりして数秒後にはちゃんとサーバーにも反映してます。超絶便利!