如何强制清理内存PHP

时间:2014-03-20 12:07:42

标签: php symfony

如何在PHP上强制清理内存? 版本PHP:5.5

我的symfony2命令:     

namespace NNNN\NNNN\Command;

use NNNN\NNNN\Model\Newsletter;
use NNNN\NNNN\Model\NewsletterQuery;
use NNNN\NNNN\Model\UsersNewslettersQuery;
use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;


class UsersNewslettersFixCommand extends ContainerAwareCommand
{
    protected function configure()
    {
        $this
            ->setName('users:newsletters:fix')
        ;
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $counter = 0;
        $users = UsersNewslettersQuery::create()
            ->setFormatter(\ModelCriteria::FORMAT_ON_DEMAND)
            ->find();

        foreach ($users as $user) {
            if ($city = $user->getCity()) {
                $countryId = $city->getCountryId();
            } elseif ($location = $user->getLocation()) {
                $countryId = $location->getCountryId();
            } elseif ($region = $user->getRegion()) {
                $countryId = $region->getCountryId();
            }
            if (isset($countryId)) {
                $user->setCountryId($countryId);
                $user->save();
            }
            ++$counter;
        }

        $output->writeln('Handled '.count($counter).' users');
    }
}

如何在一些迭代后强制清理内存? ++ $ counter之后的gc_collect_cycles对使用的内存没有影响。

get_memory_usage输出: enter image description here

1 个答案:

答案 0 :(得分:0)

这是大多数ORM的一般问题。他们倾向于使用额外的内存来提高性能。不幸的是,你偶尔会发现他们使用太多内存的时间。

解决方案是在遇到这些情况时不要使用ORM。当你需要处理大量数据时,切换到像PDO这样的较低级别。

$dbh = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);

$statement = $dbh->prepare("
  select * from users
  where !countryId
");
$statement->execute();

$updateStatement = $dbh->prepare("
  update user set countryId = :countryId
");
while ($user = $statement->fetchObject()) {
  // find countryId

  $updateStatement->execute(array(
    'countryId' => $countryId
  ));
}

那只会使用几KB内存并且执行速度非常快(只要数据库中有适当的索引)。