我在PHP中创建一个WebService,我的网站将用它来查询Ajax调用的信息.
起初我只是使用内置的PHP mysql lib以标准方式完成它,并手动编写所有查询并在MySQL Workbench中创建整个数据模型等等.这非常耗时,如果我不得不改变数据模型,之后一切都会变得非常复杂,所以我决定寻找一个PHP ORM,我发现RedBean在我看来是纯粹的魔法和快乐.
除了我在性能问题上非常困难.我的网站是一个网站,供用户创建自己的电视连续剧列表.我查询一个系列的外部源并将其插入我的数据库,如果它还没有,否则我从我自己的数据库ofc中获取它.
我从这个外部来源回来的xml列出了系列,季节,剧集等等,我把这一切都存储起来.
function InsertSerie($serie) { $serieBean = $this->CreateSerieBean($serie->Series); $genreBeans = $this->CreateGenreBeans($serie->Series->Genre); $actorBeans = $this->CreateActorBeans($serie->Series->Actors); $episodeBeans = array(); foreach ($serie->Episode as $episode) { $episodeBean = $this->CreateEpisodeBean($episode); $seasonBean = $this->CreateSeasonBean($episode); $writerBeans = $this->CreateWriterBeans($episode->Writer); $guestBeans = $this->CreateActorBeans($episode->GuestStars); $directorBeans = $this->CreateDirectorBeans($episode->Director); R::associate($episodeBean,$seasonBean); foreach ($writerBeans as $bean) { R::associate($episodeBean,$bean); } foreach ($guestBeans as $bean) { R::associate($episodeBean,$bean); } foreach ($directorBeans as $bean) { R::associate($episodeBean,$bean); } $episodeBeans[] = $episodeBean; } foreach ($genreBeans as $bean) { R::associate($serieBean,$bean); } foreach ($actorBeans as $bean) { R::associate($serieBean,$bean); } foreach ($episodeBeans as $bean) { R::associate($serieBean,$bean); } } function CreateGenreBeans($genres) { if(empty($genres)) { return; } $genre = explode("|",$genres); $genreBeans = array(); foreach ($genre as $g) { if($g != '') { $genreBeans[] = $this->CreateGenreBean($g); } } return $genreBeans; } function CreateGenreBean($genre) { $bean = R::dispense('genre'); $bean->name = (string)$genre; return $bean; } function CreateDirectorBeans($directors) { if(empty($directors)) { return; } $director = explode("|",$directors); $directorBeans = array(); foreach ($director as $d) { if($d != '') { $directorBeans[] = $this->CreateDirectorBean($d); } } return $directorBeans; } function CreateDirectorBean($director) { $bean = R::dispense('director'); $bean->name = (string)$director; return $bean; } function CreateActorBeans($actors) { if(empty($actors)) { return; } $actor = explode("|",$actors); $actorBeans = array(); foreach ($actor as $a) { if($a != '') { $actorBeans[] = $this->CreateActorBean($a); } } return $actorBeans; } function CreateActorBean($actor) { $bean = R::dispense('actor'); $bean->name = (string)$actor; return $bean; } function CreateWriterBeans($writers) { if(empty($writers)) { return; } $writer = explode("|",$writers); $writerBeans = array(); foreach ($writer as $w) { if($w != '') { $writerBeans[] = $this->CreateWriterBean($w); } } return $writerBeans; } function CreateWriterBean($writer) { $bean = R::dispense('writer'); $bean->name = (string)$writer; return $bean; } function CreateSerieBean($serie) { $bean = R::dispense('serie'); $bean->serie_id = (string)$serie->id; $bean->airs_day_of_week = (string)$serie->Airs_DayOfWeek; $bean->airs_time = (string)$serie->Airs_Time; $bean->content_rating = (string)$serie->ContentRating; $bean->first_aired = (string)$serie->FirstAired; $bean->imdb_id = (string)$serie->IMDB_ID; $bean->language = (string)$serie->Language; $bean->network = (string)$serie->Network; $bean->overview = (string)$serie->Overview; $bean->rating = (string)$serie->Rating; $bean->rating_count = (string)$serie->RatingCount; $bean->run_time = (string)$serie->Runtime; $bean->serie_name = (string)$serie->SeriesName; $bean->status = (string)$serie->Status; $bean->last_updated = (string)$serie->lastupdated; $bean->thumbnail = (string)$serie->thumbnail; return $bean; } function CreateSeasonBean($episode) { $bean = R::dispense('season'); $bean->season_id = (string)$episode->seasonid; $bean->season_number = (string)$episode->SeasonNumber; return $bean; } function CreateEpisodeBean($episode) { $bean = R::dispense('episode'); $bean->episode_id = (string)$episode->id; $bean->episode_name = (string)$episode->EpisodeName; $bean->episode_number = (string)$episode->EpisodeNumber; $bean->first_aired = (string)$episode->FirstAired; $bean->imdb_id = (string)$episode->IMDB_ID; $bean->language = (string)$episode->Language; $bean->overview = (string)$episode->Overview; $bean->rating = (string)$episode->Rating; $bean->rating_count = (string)$episode->RatingCount; $bean->last_updated = (string)$episode->lastupdated; return $bean; }
问题是插入一个系列需要大约5分钟,并且它也插入重复项,执行R :: freeze();也没有帮助表现.
问:我如何解决这个问题,我能做些什么来使redbean表现更好,我可以用自己的代码做些什么来使其更好地工作,或者我应该简单地使用不同的解决方案/方法框架等?
尝试共享列表,如建议但具有相同的结果.
function InsertSerie($serie) { $serieBean = $this->CreateSerieBean($serie->Series); ... foreach ($serie->Episode as $episode) { $episodeBean = $this->CreateEpisodeBean($serieBean,$episode); ... $this->CreateDirectorBeans($serieBean,$episode->Director); $serieBean->sharedEpisode[] = $episodeBean; } R::store($serieBean); } function CreateDirectorBeans($bean,$directors) { if(empty($directors)) { return; } $director = explode("|",$directors); foreach ($director as $d) { if($d != '') { $bean->sharedDirector[] = $this->CreateDirectorBean($d); } } } function CreateDirectorBean($director) { $bean = R::dispense('director'); $bean->name = (string)$director; return $bean; } ....