什麼是數位海洋?
Digital Ocean 是成長最快的網路主機之一,部分原因在於其基於 SSD 的快速伺服器和每月 5 美元的廉價託管計劃。在 Digital Ocean 上啟動實例進行測試或長期使用是快速、簡單且經濟實惠的。
在 Digital Ocean 建立用於轉售的應用程式映像中,我向您介紹如何啟動 WordPress(或其他應用程式)實例並為客戶重複複製它。在本教程中,我將指導您使用 Digital Ocean API 以程式設計方式管理我們的實例(也稱為 Droplet),並自動執行常見任務。我還將提供一個範例程式碼庫,用於運行在 Yii Framework for PHP 中編寫的非常基本的 API 操作;您可以在 Github 上取得程式碼。
數位海洋 API
Digital Ocean API 可讓您使用 HTTP 請求以簡單的程式設計方式管理 Droplet 和資源。您在 Digital Ocean 控制面板中熟悉的所有功能也可以透過 API 取得,讓您能夠根據您的情況需求編寫複雜操作的腳本。
在本教學中,我們將把開發人員 Antoine Corcy 的 Digital Ocean V2 PHP API 函式庫整合到基於 Yii 的控制台應用程式中。您不需要了解 Yii 即可使用該應用程序,但您可以在此處了解更多資訊:Yii 框架簡介。
#Digital Ocean API 透過 OAuth 驗證您的帳戶,由近十幾個進階區域組成:
- 帳戶:提供有關您的 Digital Ocean 帳戶的基本資訊。
- 操作:您帳戶中 Droplet 的操作歷史日誌。
- 網域名稱和網域名稱記錄:讓您可以管理帳戶中 Droplet 上使用的網域名稱以及與其關聯的 DNS 記錄。
- Droplet 和 Droplet 操作:允許您為 Droplet 建立、關閉、重新啟動、快照等。
- 映像與映像操作:允許您列舉並管理您帳戶中為 Droplet 拍攝的快照影像。
- SSH 金鑰:允許您在建立 Droplet 時註冊要安裝的 SSH 金鑰,這樣就不需要密碼安全性。
- 區域:列舉可以在其中創建數位海洋水滴的地理區域。
- 尺寸:枚舉創建液滴時可以使用的液滴尺寸。
現在您已經了解了一些 API,讓我們深入了解我們自己的應用程式。
設定存取金鑰
為了使用 API,您需要為您的帳戶啟動個人存取權杖。登入您的帳戶並造訪設定應用程式頁面:https://cloud.digitalocean.com/settings/applications。點選產生新令牌,如下圖:
記下下面您的訪問令牌 - Digital Ocean 只會向您顯示一次:
現在,讓我們轉到範例控制台應用程式。
我們的控制台應用程式
在本教程中,我們將探索我建立的一個小型控制台應用程序,該應用程式執行一些與管理 Droplet 相關的任務。您可以從 Tuts GitHub 儲存庫自行安裝應用程序,並自訂或擴充它以實現您想要的其他 API 功能。我已經在我的網站上發布了控制台應用程式的詳細安裝指南。您也可以瀏覽我的 Digital Ocean 應用程式通用安裝指南。
配置 API 存取
我們再次使用 Antoine Corcy 的 Digital Ocean V2 PHP API 函式庫來存取 API。
我們建立了一個名為 Ocean.php 的元件,它充當使用他的函式庫的模型。它位於 /app/protected/components/Ocean.php
。
Yii 從 Ocean.ini 檔案載入您的存取權杖(如《數位海洋控制台應用程式安裝指南》所述),並實例化 digitalOcean
API 物件。
<?php use DigitalOceanV2\Adapter\BuzzAdapter; use DigitalOceanV2\DigitalOceanV2; class Ocean extends CComponent { private $adapter; private $digitalOcean; function __construct() { // create an adapter with your access token which can be // generated at https://cloud.digitalocean.com/settings/applications $this->adapter = new BuzzAdapter(Yii::app()->params['ocean']['access_key']); // create a digital ocean object with the previous adapter $this->digitalOcean = new DigitalOceanV2($this->adapter); }
取得 Droplet
現在,讓我們來取得活躍 Droplet 的清單。在 /app/protected/models/Droplet.php
中,我們的 sync
方法呼叫 Ocean 元件並取得 Droplet:
public function sync() { $ocean = new Ocean(); $droplets = $ocean->getDroplets(); foreach ($droplets as $d) { $droplet_id = $this->add($d); } }
Ocean getDroplets
方法如下:
public function getDroplets() { // return the action api $action = $this->digitalOcean->droplet(); // return a collection of Action entity $actions = $action->getAll(); return $actions; }
注意:基本控制台應用程式僅對我們的 Droplet 清單進行單向下載同步。您可以自行實現更多功能,包括刪除已在雲端刪除的水滴。
這是我們的 Droplet 模型的 add
函數。如果 Droplet 已經存在,我們只需更新記錄:
public function add($droplet) { $d = Droplet::model()->findByAttributes(array('droplet_id'=>$droplet->id)); if (empty($d)) { $d = new Droplet; } $d->user_id = Yii::app()->user->id; $d->droplet_id = $droplet->id; $d->name = $droplet->name; $d->vcpus = $droplet->vcpus; $d->memory = $droplet->memory; $d->disk = $droplet->disk; $d->status = $droplet->status; $d->active =1; $d->created_at = $d->created_at; $d->modified_at =new CDbExpression('NOW()'); $d->save(); return $d->id; }
如果您希望扩展模型的功能,Digital Ocean 提供了各种 Droplet API 操作,Corcy 在此列出了清晰的示例。
获取图像
接下来,我们将使用 API 来获取当前图像的列表。映像是快照,本质上是备份,是在给定时间点从服务器实例获取的。
我们的 Snapshot.php 模型有一个 sync
操作,它会请求图像列表并添加将它们分别写入数据库:
public function sync() { $ocean = new Ocean(); $snapshots = $ocean->getSnapshots(); foreach ($snapshots as $i) { $image_id = $this->add($i); if ($image_id!==false) { echo $image_id;lb(); pp($i); } } }
这是海洋组件 getSnapshots
代码:
public function getSnapshots() { // return the action api $action = $this->digitalOcean->image(); // return a collection of Action entity $actions = $action->getAll(); return $actions; }
这是快照模型 add
代码 - 我们忽略 Digital Ocean 的库存应用程序映像,这些映像被区分为公共:
public function add($snapshot) { $i = Snapshot::model()->findByAttributes(array('image_id'=>$snapshot->id)); if (empty($i)) { $i = new Snapshot; $i->created_at =new CDbExpression('NOW()'); } if (isset($snapshot->public) and $snapshot->public ==1) { return false; // no need to save public images right now } else $i->user_id = Yii::app()->user->id; $i->image_id = $snapshot->id; $i->name = $snapshot->name; $i->region = $snapshot->regions[0]; $i->active =1; $i->modified_at =new CDbExpression('NOW()'); $i->save(); return $i->id; }
自动化快照
正如我们在构建要在 Digital Ocean 进行转售的应用映像中所讨论的那样,自动创建可传输给客户和顾客的快照非常有用。遗憾的是,目前无法通过引用克隆或传输图像;每次您将快照转移到另一个帐户时,它就会消失。
由于 Digital Ocean 要求您将图像实例化为 Droplet,并在拍摄新快照之前将其关闭,因此重复创建快照是一个耗时的手动过程。 Digital Ocean 在拍摄快照后再次启动水滴并没有什么帮助,这只会减慢进程。
由于 API 在其他操作挂起时不接受请求,因此我们必须构建一个表来跟踪后台操作并使用 cron 作业来重复断电、快照操作。其工作原理如下:
访问图像页面,然后单击您想要克隆的快照的查看。然后,单击右侧的复制菜单选项。
这将创建一个 Droplet 并使用此 image_id
和droplet_id
。 end_stage
是一个常量,您可以设置它来指示要创建的重复项的数量。
这是 Snapshot 模型的 replicate()
方法:
public function replicate($id) { // look up image_id $snapshot = Snapshot::model()->findByAttributes(array('id'=>$id)); // create the droplet $ocean = new Ocean(); $droplet_id = $ocean->launch_droplet($snapshot->name,$snapshot->region,$snapshot->image_id); // add command to action table with droplet_id and image_id $a = new Action(); $a->droplet_id = $droplet_id; $a->snapshot_id = $snapshot->image_id; $a->action = Action::ACTION_SNAPSHOT; $a->status = Action::STATUS_ACTIVE; $a->stage = 0; // user settable constant for number of replications to make $a->end_stage = Snapshot::NUMBER_REPLICATIONS; $a->last_checked = 0; $a->modified_at =new CDbExpression('NOW()'); $a->created_at =new CDbExpression('NOW()'); $a->save(); }
cron 任务将 ping http://ocean.yourdomain.com/daemon/index 以定期处理操作表。任何未完成的逾期项目都将请求另一个快照。
这是 Action 模型的 process()
方法:
public function process() { set_time_limit(0); // look for overdue actions $todo = Action::model()->overdue()->findAllByAttributes(array('status'=>self::STATUS_ACTIVE)); foreach ($todo as $item) { if ($item->action == self::ACTION_SNAPSHOT) { $result = Snapshot::model()->take($item->id); } } }
快照过程将关闭 Droplet,暂停 20 秒等待 Droplet 关闭,并请求快照。
这是 Snapshot 模型的 take()
方法:
public function take($action_id) { $result = false; $a = Action::model()->findByPk($action_id); $snapshot = Snapshot::model()->findByAttributes(array('image_id'=>$a->snapshot_id)); $ocean = new Ocean(); // attempt shutdown // take snapshot $result = $ocean->snapshot($a->stage,$a->droplet_id,$snapshot->name,$snapshot->region,$snapshot->image_id); // if snapshot was successful if ($result) { // increment stage $a->stage+=1; // if last snapshot replication complete, end action if ($a->stage >= $a->end_stage) $a->status = Action::STATUS_COMPLETE; } // either way, update last_checked $a->last_checked = time(); $a->save(); return $result; }
以下是 Ocean 组件中用于实际进行 API 调用的代码:
public function snapshot($stage,$droplet_id,$name,$region,$image_id,$begin=1,$count=3,$size='512mb') { $no_sleep = false; $name = str_replace("_","-",$name); $droplet = $this->digitalOcean->droplet(); try { echo 'Shutting down '.$droplet_id;lb(); $shutdown = $droplet->shutdown($droplet_id); } catch (Exception $e) { $err = $e->getMessage(); echo 'Caught exception: ', $e->getMessage(), "\n"; if (stristr ( $err , 'already powered off')===false) return false; else $no_sleep = true; } if (!$no_sleep) { echo 'Sleep 20 seconds for power off...';lb(); sleep(20); } echo 'Take snapshot of '.$droplet_id.' named '.$name.'-copy-'.$stage;lb(); try { $snapshot = $droplet->snapshot($droplet_id, $name.'-copy-'.$stage); } catch (Exception $e) { echo 'Caught exception: ', $e->getMessage(), "\n"; return false; } // shutdown and snapshot successful return true; }
如果您访问 Digital Ocean 网站查看 Droplet,您将看到正在进行的操作:
如果快照成功,则返回Snapshot模型以递增阶段。当阶段复制完成后,操作完成。
您可以访问 Digital Ocean 网站的图像页面来查看复制的快照:
创建图像后,您可以手动删除 Droplet,或者您可以扩展代码以在 STATUS_COMPLETE
已达到。如果您不删除 Droplet,我们将向您收取费用。
请注意,目前 API 不提供将快照传输到电子邮件地址的功能,因此您需要继续通过网络界面手动执行此操作。
下一步是什么?
我希望您喜欢本教程,并发现 Digital Ocean 是您的工具和托管提供商组合中的一项有用服务。在下一个教程中,我们将探索 Digital Ocean DNS 服务。
请随时在下面发表您的问题和评论。您也可以通过 Twitter @reifman 联系我或直接给我发电子邮件。请关注我的 Tuts+ 讲师页面,查看本系列后续文章。
相关链接
- 数字海洋 API
- Digital Ocean V2 PHP API 库
- 数字海洋控制台应用程序安装指南
以上是使用 Digital Ocean API 管理雲端實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

PHP起源於1994年,由RasmusLerdorf開發,最初用於跟踪網站訪問者,逐漸演變為服務器端腳本語言,廣泛應用於網頁開發。 Python由GuidovanRossum於1980年代末開發,1991年首次發布,強調代碼可讀性和簡潔性,適用於科學計算、數據分析等領域。

PHP適合網頁開發和快速原型開發,Python適用於數據科學和機器學習。 1.PHP用於動態網頁開發,語法簡單,適合快速開發。 2.Python語法簡潔,適用於多領域,庫生態系統強大。

PHP在現代化進程中仍然重要,因為它支持大量網站和應用,並通過框架適應開發需求。 1.PHP7提升了性能並引入了新功能。 2.現代框架如Laravel、Symfony和CodeIgniter簡化開發,提高代碼質量。 3.性能優化和最佳實踐進一步提升應用效率。

PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip

PHP類型提示提升代碼質量和可讀性。 1)標量類型提示:自PHP7.0起,允許在函數參數中指定基本數據類型,如int、float等。 2)返回類型提示:確保函數返回值類型的一致性。 3)聯合類型提示:自PHP8.0起,允許在函數參數或返回值中指定多個類型。 4)可空類型提示:允許包含null值,處理可能返回空值的函數。

PHP中使用clone關鍵字創建對象副本,並通過\_\_clone魔法方法定制克隆行為。 1.使用clone關鍵字進行淺拷貝,克隆對象的屬性但不克隆對象屬性內的對象。 2.通過\_\_clone方法可以深拷貝嵌套對象,避免淺拷貝問題。 3.注意避免克隆中的循環引用和性能問題,優化克隆操作以提高效率。

PHP適用於Web開發和內容管理系統,Python適合數據科學、機器學習和自動化腳本。 1.PHP在構建快速、可擴展的網站和應用程序方面表現出色,常用於WordPress等CMS。 2.Python在數據科學和機器學習領域表現卓越,擁有豐富的庫如NumPy和TensorFlow。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

禪工作室 13.0.1
強大的PHP整合開發環境

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Dreamweaver CS6
視覺化網頁開發工具

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境