20

PHP + MySQL で CMS を作成しています。自己更新可能にしたい(管理パネルでワンクリックを投げる)。ベストプラクティスは何ですか?
cms の現在のバージョンとアップデートのバージョン (アプリケーション自体とデータベース) を比較する方法。zipアーカイブをダウンロードし、それをアップジップしてファイルを上書きするだけですか? (ただし、使用されなくなったファイルをどうするか)。アップデートが正しくダウンロードされたかどうかを確認する方法は? また、モジュールをサポートしており、このモジュールを cms の管理パネルからダウンロードできるようにしたいと考えています。
また、MySQL テーブルを更新するにはどうすればよいですか?

4

6 に答える 6

10
  • コードは、構成ファイルやその他の変数ファイル (アップロードされた画像、キャッシュ ファイルなど) とは別の場所に保管してください。
  • モジュールもメインコードから分離してください。
  • コード自体を変更するためのファイル システム権限がコードにあることを確認します (たとえば、SuPHP を使用します)。

これらを行う場合、最も簡単な方法は、新しいバージョンを完全にダウンロードし (増分パッチなし)、現在のバージョンを含むディレクトリに隣接するディレクトリに解凍することです。コード ディレクトリ内には変数ファイルが存在しないため、古いファイルを削除するか名前を変更し、新しいファイルの名前を変更して置き換えることができます。

コード内のグローバル定数にバージョン番号を保持できます。

MySQLに関してはDBレイアウトを変更するバージョンごとにアップグレードスクリプトを作るしかありません。テーブル定義を変更する自動ソリューションでさえ、既存のデータを更新する方法を知ることができません。

于 2010-03-13T20:43:41.413 に答える
8

もう少し実験的な解決策は、phpsvnclientライブラリのようなものを使用することです。

特徴:

  • 指定された SVN リポジトリ ディレクトリ内のすべてのファイルを一覧表示する
  • ファイルの特定のリビジョンを取得する
  • 2 つのリビジョン間でリポジトリまたは特定のファイルに加えられた変更のログを取得する
  • リポジトリの最新リビジョンを取得する

このようにして、新しいファイル、削除されたファイル、または更新されたファイルがあるかどうかを確認し、ローカル アプリケーションでそれらのみを変更することができます。

これを実装するのは少し難しいと思いますが、CMS に更新を簡単かつ迅速に追加できるという利点があります。

于 2010-03-24T12:11:36.457 に答える
3

対処するシナリオが 2 つあります。

  1. Web サーバーはファイルに書き込むことができます。
  2. Web サーバーがファイルに書き込めません。

これは、ZIP ファイルを解凍するか、FTP を使用してファイルを更新するかを決定するだけです。それ以外の場合、最初のステップは、データベースのダンプと既存のファイルのバックアップを作成することです。これにより、何かひどく問題が発生した場合にユーザーがロールバックできるようになります。他の人が言ったように、ユーザーがカスタマイズする可能性が高いものはすべて更新の範囲外に保つことが重要です. Wordpress はこれをうまく処理します。ユーザーがコア ロジック コードに変更を加えた場合、マージの競合を自分で解決できるほど賢明です (また、1 回のクリックでアップグレードすると変更が失われる可能性があることを認識できるほど賢明です)。

2 番目のステップは、ブラウザーを閉じてもスクリプトが停止しないようにすることです。これは、中断してはならないプロセスです。ignore_user_abort(true);、またはその他の手段でこれを達成できます。または、必要に応じて、ユーザーが「切断されても続行する」というボックスをチェックできるようにします。内部でエラーを処理することを想定しています。

現在、権限に応じて、次のいずれかを実行できます。

  • 更新するファイルをシステムの /tmp ディレクトリに圧縮します
  • 更新するファイルをホーム ディレクトリの一時ファイルに圧縮します。

これで、次の準備が整いました。

  • 更新プログラムをダウンロードして解凍するen situか、その場で解凍します。
  • システムの /tmp ディレクトリに更新をダウンロードして解凍し、FTP を使用して Web ルートのファイルを更新します。

その後、次のことができます。

  • 必要に応じて SQL の変更を適用する
  • すべてがうまくいったかどうかユーザーに尋ねる
  • うまくいかなかった場合は元に戻す
  • システムの /tmp ディレクトリ内の一時ディレクトリ、またはユーザーの Web ルート / ホーム ディレクトリ内のステージング ファイルをクリーンアップします。

最も重要な側面は、問題が発生した場合に変更をロールバックできるようにすることです。/tmp を使用する場合は、ステージング領域のアクセス許可を必ず確認してください。0600うまくやるべきです。

Wordpress や他の人がどのようにそれを行っているかを見てみましょう。選択したライセンスとそれらのライセンスが一致する場合は、そのコードの一部を再利用できる可能性さえあります。

あなたのプロジェクトで頑張ってください。

于 2010-03-23T04:41:14.957 に答える
2

この問題を解決しようとするSQLOO(私が作成した)と呼ばれるSQLライブラリがあります。まだ少し大雑把ですが、基本的な考え方は、PHPコードでSQLスキーマを設定してから、SQLOOが現在のデータベーススキーマをコードに一致するように変更することです。これにより、SQLスキーマと添付されたPHPコードを一緒に、はるかに小さなチャンクで変更できます。

http://code.google.com/p/sqloo/

http://code.google.com/p/sqloo/source/browse/#svn/trunk/example<-

于 2010-03-18T19:53:14.463 に答える
2

多くのアプリケーション、CMS などの経験に基づくと、これは一般的なパターンです。

  • 通常、アップグレードは一方通行です。障害発生時の復元のために完全なシステム状態のスナップショットを作成することは可能ですが、復元するには通常、アップグレード以降にシステムに追加されたデータ/コンテンツ/ログが失われます。インクリメンタル ロールバックを実行すると、何かが適切に変換されていない場合 (データベース テーブルの変更、コンテンツの変換、外部キー制約、インデックスの作成など)、データが危険にさらされる可能性があります。これは、ロールバック スクリプトで実行できないカスタマイズを行った場合に特に当てはまります。おそらく説明します。
  • アップグレード ファイルは、md5 または sha1 ハッシュやデジタル署名などの認証/検証手段とともにパッケージ化され、信頼できるソースからのものであり、改ざんされていないことを確認します。これは、自動アップグレード プロセスでは特に重要です。ハッカーが脆弱性を悪用し、不正なソースからアップグレードするように指示したとします。
  • アップグレード中は、アプリケーションをオフライン モードにする必要があります。
  • アプリケーションは、アップグレード後にセルフチェックを実行する必要があります。
于 2010-03-24T12:29:38.693 に答える
0

Bart van Heukelomの答えに同意します。これが最も一般的な方法です。

他の唯一のオプションは、CMS を一群のリモート Web サービス/スクリプトと、1 か所のみでホストする外部 CSS/JS ファイルに変えることです。

次に、CMS を使用するすべての人が中央の「CMS サーバー」に接続し、(呼び出し元の) サーバー上にあるのは、すべての処理と出力を行う Web サービス/スクリプトを呼び出すための一連のスクリプトだけです。このルートをたどった場合は、各リクエストを識別/認証して、特定の CMS ユーザーに対応するデータを返す必要があります。

于 2010-03-17T16:56:44.733 に答える