Неправильный размер папок owncloud в freebsd x86
owncloud php
Published: 2014-01-25

Так случилось, что появилась необходимость бэкапить накопленные архивы фотографий, поэтому поставил себе в 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 самому конвертировать число в нужный тип при помощи сложения с нулем. Для этого надо подредактировать некоторые файлы:

  1. Редактируем /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;
    
  2. Редактируем /path/to/owncloud/lib/private/files/cache/homecache.php

    Меняем в строке 100:

    <?php
    
    $data['size'] = (int)$data['size'];
    

    на

    <?php
    
    $data['size'] = 0+$data['size'];
    
  3. Редактируем /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-битной платформе будет вполне достаточно.

comments powered by Disqus