如何在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输出:
答案 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内存并且执行速度非常快(只要数据库中有适当的索引)。