PHP wrapper for smbclient and libsmbclient-php
- Reuses a single
smbclientinstance for multiple requests - Doesn't leak the password to the process list
- Simple 1-on-1 mapping of SMB commands
- A stream-based api to remove the need for temporary files
- Support for using libsmbclient directly trough
libsmbclient-php
<?php
use Icewind\SMB\ServerFactory;
use Icewind\SMB\BasicAuth;
require('vendor/autoload.php');
$serverFactory = new ServerFactory();
$auth = new BasicAuth('user', 'workgroup', 'password');
$server = $serverFactory->createServer('localhost', $auth);
$share = $server->getShare('test');The server factory will automatically pick between the smbclient and libsmbclient-php
based backend depending on what is available.
$serverFactory = new ServerFactory();
$auth = new AnonymousAuth();
$server = $serverFactory->createServer('localhost', $auth);$serverFactory = new ServerFactory();
$auth = new KerberosAuth();
$server = $serverFactory->createServer('localhost', $auth);Note that this requires a valid kerberos ticket to already be available for php
$share->put($fileToUpload, 'example.txt');$share->get('example.txt', $target);$shares = $server->listShares();
foreach ($shares as $share) {
echo $share->getName() . "\n";
}$content = $share->dir('test');
foreach ($content as $info) {
echo $info->getName() . "\n";
echo "\tsize :" . $info->getSize() . "\n";
}$fh = $share->read('test.txt');
echo fread($fh, 4086);
fclose($fh);$fh = $share->write('test.txt');
fwrite($fh, 'bar');
fclose($fh);Note: write() will truncate your file to 0bytes. You may open a writeable stream with append() which will point the cursor to the end of the file or create it if it does not exists yet. (append() is only compatible with libsmbclient-php)
$fh = $share->append('test.txt');
fwrite($fh, 'bar');
fclose($fh);$share->notify('')->listen(function (\Icewind\SMB\Change $change) {
echo $change->getCode() . ': ' . $change->getPath() . "\n";
});$options = new Options();
$options->setTimeout(5);
$serverFactory = new ServerFactory($options);The smbclient backend needs to get various information about the system it's running on to function
such as the paths of various binaries or the system timezone.
While the default logic for getting this information should work on most systems, it possible to customize this behaviour.
In order to customize the integration you provide a custom implementation of ITimezoneProvider and/or ISystem and pass them as arguments to the ServerFactory.
Use the following steps to check if the library can connect to your SMB share.
- Clone this repository or download the source as zip
- Make sure composer is installed
- Run
composer installin the root of the repository - Edit
example.phpwith the relevant settings for your share. - Run
php example.php
If everything works correctly then the contents of the share should be outputted.

