rackspace/php-opencloud
PHP SDK for Rackspace OpenCloud/OpenStack services. Manage Cloud Servers, Files, DNS, Load Balancers, Databases, Monitoring, and Identity via a unified API with authentication, region support, and common resource helpers for building cloud integrations.
## Getting Started
### Minimal Setup
1. **Installation**
```bash
composer require rackspace/php-opencloud
Ensure your project uses PHP 5.6+ (last maintained version). Note: PHP version checks are now handled by Composer.
Basic Configuration Create a service container instance with your OpenStack credentials:
use OpenCloud\OpenStack;
use OpenCloud\Common\ServiceBuilder;
$config = [
'username' => 'your-username',
'password' => 'your-password',
'tenantName' => 'your-tenant',
'authUrl' => 'https://your-openstack-auth-url:5000/v3',
];
$serviceBuilder = new ServiceBuilder();
$serviceBuilder->addService('ObjectStore', 'rackspace', [
'region' => 'your-region',
'endpointType' => 'publicURL',
]);
$openStack = new OpenStack($config, $serviceBuilder);
First Use Case: List Containers
$objectStore = $openStack->objectStoreService('rackspace');
$containers = $objectStore->listContainers();
foreach ($containers as $container) {
echo $container->name . "\n";
}
src/OpenCloud/ directory (core classes and services)Upload/Download Files
$container = $objectStore->getContainer('my-container');
$object = $container->uploadObject('file.txt', fopen('local-file.txt', 'r'));
$content = $container->downloadObject('file.txt');
Streaming Large Files
$object = $container->uploadObject('large-file.zip', fopen('large-file.zip', 'r'), [
'Content-Type' => 'application/zip',
], true); // Stream large files
Delete Objects via Container
$container = $objectStore->getContainer('my-container');
$container->deleteObject('file.txt'); // New in v1.16.0
Temporary URLs
$tempUrl = $object->getTemporaryUrl('GET', '+1 hour'); // Fixed in v1.16.0
Metadata Handling
$object->setMetadata(['custom-key' => 'value']);
$metadata = $object->getMetadata();
List Servers
$compute = $openStack->computeService();
$servers = $compute->listServers();
foreach ($servers as $server) {
echo $server->name . ' (Status: ' . $server->status . ')' . "\n";
}
Create Server with Ports/Security Groups
$server = $compute->createServer([
'name' => 'my-server',
'imageRef' => 'image-id',
'flavorRef' => 'flavor-id',
'networks' => [['port' => 'port-id']], // New in v1.16.0
'security_groups' => ['sg-id'], // New in v1.16.0
]);
Server Metadata
$server->setMetadata(['key' => 'value']); // Fixed in v1.16.0
$loadBalancer = $openStack->loadBalancerService();
$loadBalancer->addMember('lb-id', ['member' => ['address' => '1.2.3.4']]); // Refactored in v1.16.0
$identity = $openStack->identityService();
$users = $identity->listUsers();
$tenants = $identity->listTenants();
OpenStack instance in Laravel’s service container:
$this->app->singleton('openstack', function ($app) {
return new OpenStack(config('openstack.credentials'), $app['openstack.service_builder']);
});
.env:
OPENSTACK_USERNAME=your-username
OPENSTACK_PASSWORD=your-password
OPENSTACK_TENANT=your-tenant
OPENSTACK_AUTH_URL=https://auth.example.com:5000/v3
OpenCloud\Common\ServiceException:
try {
$objectStore->deleteContainer('my-container');
} catch (\OpenCloud\Common\ServiceException $e) {
Log::error('OpenStack Error: ' . $e->getMessage());
}
Deprecated API Versions
Region/Endpoint Mismatch
authUrl) can break across environments.endpointType (publicURL, internalURL, adminURL) and validate regions:
$serviceBuilder->addService('ObjectStore', 'rackspace', [
'region' => 'DFW', // Rackspace region
'endpointType' => 'publicURL',
]);
Token Expiry
401 Unauthorized.if ($identity->getToken()->isExpired()) {
$openStack->reauthenticate();
}
Large File Handling
$object->uploadObject(..., true)) and increase PHP timeouts:
ini_set('default_socket_timeout', 300); // 5 minutes
Case Sensitivity
$containerName = strtolower(trim($containerName)); // Normalize
Server Creation Edge Cases
$serviceBuilder->setDebug(true); // Logs raw HTTP requests/responses
$object->setMetadata(['X-Object-Meta-Debug' => 'true']);
$e->getResponse()->getStatusCode() in exceptions.$members = $loadBalancer->listMembers('lb-id');
Custom Services
Extend OpenCloud\Common\Service to add support for unsupported services (e.g., Block Storage, Networking):
class CustomService extends \OpenCloud\Common\Service {
public function customMethod() { ... }
}
$serviceBuilder->addService('Custom', 'rackspace', ['class' => 'CustomService']);
Middleware Add request/response middleware for logging, retries, or auth:
$serviceBuilder->addMiddleware(new class implements \OpenCloud\Common\Middleware {
public function handle($request, \Closure $next) {
// Pre-request logic
$response = $next($request);
// Post-response logic
return $response;
}
});
Event Listeners
Listen for service events (e.g., object uploads) via OpenCloud\Common\Event\Events:
$serviceBuilder->addListener('object.upload', function ($event) {
Log::info('Uploaded: ' . $event->getObject()->name);
});
Temporary URL Generation Le
How can I help you explore Laravel packages today?