Так случилось, что появилась необходимость бэкапить накопленные архивы фотографий, поэтому поставил себе в jail на фряхе owncloud 6.0.0a. Ничего сложного в этом нет, кроме как необходимость собирать nginx, php и mysql с нужными модулями из исходников, т.к. в пакетах нет необходимого. Может как-нибудь в будущем накатаю пост об этом.
Итак, в установленном и работающем ownCloud размеры синхронизированных папок отображаются неправильно: максимально показывается 2ГБ на папку, а общие занятое и свободное пространства неверные.
Проблема кроется в том, что в 32-битной версии php целое число integer может иметь максимальное значение ~ 2 млрд (2 147 483 647 Байт = 2ГБ), а именно приведение к целому числу и используется в owncloud при постройке кэша, например:
<?php
$data['size'] = (int)$data['size'];
Нам же необходим тип float или long, поэтому пользователь MiguelDomingues с форума owncloud предлагает вместо приведения к int заставить php самому конвертировать число в нужный тип при помощи сложения с нулем. Для этого надо подредактировать некоторые файлы:
-
Редактируем /path/to/owncloud/lib/private/files/cache/cache.php
Меняем в строке 145:
<?php $data['size'] = (int)$data['size'];
на:
<?php $data['size'] = 0+$data['size'];
Меняем в строке 149:
<?php $data['unencrypted_size'] = (int)$data['unencrypted_size'];
на
<?php $data['unencrypted_size'] = 0+$data['unencrypted_size'];
Меняем в строке 425:
<?php if ((int)$row['size'] === -1) {
на
<?php if (0+$row['size'] === -1) {
Меняем в строках 519-520:
<?php $sum = (int)$sum; $min = (int)$min;
на
<?php $sum = 0+$sum; $min = 0+$min;
-
Редактируем /path/to/owncloud/lib/private/files/cache/homecache.php
Меняем в строке 100:
<?php $data['size'] = (int)$data['size'];
на
<?php $data['size'] = 0+$data['size'];
-
Редактируем /path/to/owncloud/lib/private/connector/sabre/server.php
Меняем в строке 172:
<?php $newProperties[200][$prop] = (int)$node->getSize();
на
<?php $newProperties[200][$prop] = 0+$node->getSize();
Кстати, можно заменить (int) на (float) вместо операции сложения. Размера в 3.4e38 на 32-битной платформе будет вполне достаточно.