PHP Red Bean ORM性能问题

前端之家收集整理的这篇文章主要介绍了PHP Red Bean ORM性能问题前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在PHP中创建一个WebService,我的网站将用它来查询Ajax调用的信息.

起初我只是使用内置的PHP mysql lib以标准方式完成它,并手动编写所有查询并在MySQL Workbench中创建整个数据模型等等.这非常耗时,如果我不得不改变数据模型,之后一切都会变得非常复杂,所以我决定寻找一个PHP ORM,我发现RedBean在我看来是纯粹的魔法和快乐.

除了我在性能问题上非常困难.我的网站是一个网站,供用户创建自己的电视连续剧列表.我查询一个系列的外部源并将其插入我的数据库,如果它还没有,否则我从我自己的数据库ofc中获取它.

我从这个外部来源回来的xml列出了系列,季节,剧集等等,我把这一切都存储起来.

  1. function InsertSerie($serie) {
  2. $serieBean = $this->CreateSerieBean($serie->Series);
  3. $genreBeans = $this->CreateGenreBeans($serie->Series->Genre);
  4. $actorBeans = $this->CreateActorBeans($serie->Series->Actors);
  5. $episodeBeans = array();
  6. foreach ($serie->Episode as $episode) {
  7. $episodeBean = $this->CreateEpisodeBean($episode);
  8. $seasonBean = $this->CreateSeasonBean($episode);
  9. $writerBeans = $this->CreateWriterBeans($episode->Writer);
  10. $guestBeans = $this->CreateActorBeans($episode->GuestStars);
  11. $directorBeans = $this->CreateDirectorBeans($episode->Director);
  12. R::associate($episodeBean,$seasonBean);
  13. foreach ($writerBeans as $bean) {
  14. R::associate($episodeBean,$bean);
  15. }
  16. foreach ($guestBeans as $bean) {
  17. R::associate($episodeBean,$bean);
  18. }
  19. foreach ($directorBeans as $bean) {
  20. R::associate($episodeBean,$bean);
  21. }
  22. $episodeBeans[] = $episodeBean;
  23. }
  24. foreach ($genreBeans as $bean) {
  25. R::associate($serieBean,$bean);
  26. }
  27. foreach ($actorBeans as $bean) {
  28. R::associate($serieBean,$bean);
  29. }
  30. foreach ($episodeBeans as $bean) {
  31. R::associate($serieBean,$bean);
  32. }
  33. }
  34.  
  35. function CreateGenreBeans($genres) {
  36. if(empty($genres)) { return; }
  37. $genre = explode("|",$genres);
  38. $genreBeans = array();
  39. foreach ($genre as $g) {
  40. if($g != '') {
  41. $genreBeans[] = $this->CreateGenreBean($g);
  42. }
  43. }
  44. return $genreBeans;
  45. }
  46.  
  47. function CreateGenreBean($genre) {
  48. $bean = R::dispense('genre');
  49. $bean->name = (string)$genre;
  50. return $bean;
  51. }
  52.  
  53. function CreateDirectorBeans($directors) {
  54. if(empty($directors)) { return; }
  55. $director = explode("|",$directors);
  56. $directorBeans = array();
  57. foreach ($director as $d) {
  58. if($d != '') {
  59. $directorBeans[] = $this->CreateDirectorBean($d);
  60. }
  61. }
  62. return $directorBeans;
  63. }
  64.  
  65. function CreateDirectorBean($director) {
  66. $bean = R::dispense('director');
  67. $bean->name = (string)$director;
  68. return $bean;
  69. }
  70.  
  71. function CreateActorBeans($actors) {
  72. if(empty($actors)) { return; }
  73. $actor = explode("|",$actors);
  74. $actorBeans = array();
  75. foreach ($actor as $a) {
  76. if($a != '') {
  77. $actorBeans[] = $this->CreateActorBean($a);
  78. }
  79. }
  80. return $actorBeans;
  81. }
  82.  
  83. function CreateActorBean($actor) {
  84. $bean = R::dispense('actor');
  85. $bean->name = (string)$actor;
  86. return $bean;
  87. }
  88.  
  89. function CreateWriterBeans($writers) {
  90. if(empty($writers)) { return; }
  91. $writer = explode("|",$writers);
  92. $writerBeans = array();
  93. foreach ($writer as $w) {
  94. if($w != '') {
  95. $writerBeans[] = $this->CreateWriterBean($w);
  96. }
  97. }
  98. return $writerBeans;
  99. }
  100.  
  101. function CreateWriterBean($writer) {
  102. $bean = R::dispense('writer');
  103. $bean->name = (string)$writer;
  104. return $bean;
  105. }
  106.  
  107. function CreateSerieBean($serie) {
  108. $bean = R::dispense('serie');
  109. $bean->serie_id = (string)$serie->id;
  110. $bean->airs_day_of_week = (string)$serie->Airs_DayOfWeek;
  111. $bean->airs_time = (string)$serie->Airs_Time;
  112. $bean->content_rating = (string)$serie->ContentRating;
  113. $bean->first_aired = (string)$serie->FirstAired;
  114. $bean->imdb_id = (string)$serie->IMDB_ID;
  115. $bean->language = (string)$serie->Language;
  116. $bean->network = (string)$serie->Network;
  117. $bean->overview = (string)$serie->Overview;
  118. $bean->rating = (string)$serie->Rating;
  119. $bean->rating_count = (string)$serie->RatingCount;
  120. $bean->run_time = (string)$serie->Runtime;
  121. $bean->serie_name = (string)$serie->SeriesName;
  122. $bean->status = (string)$serie->Status;
  123. $bean->last_updated = (string)$serie->lastupdated;
  124. $bean->thumbnail = (string)$serie->thumbnail;
  125. return $bean;
  126. }
  127.  
  128. function CreateSeasonBean($episode) {
  129. $bean = R::dispense('season');
  130. $bean->season_id = (string)$episode->seasonid;
  131. $bean->season_number = (string)$episode->SeasonNumber;
  132. return $bean;
  133. }
  134.  
  135. function CreateEpisodeBean($episode) {
  136. $bean = R::dispense('episode');
  137. $bean->episode_id = (string)$episode->id;
  138. $bean->episode_name = (string)$episode->EpisodeName;
  139. $bean->episode_number = (string)$episode->EpisodeNumber;
  140. $bean->first_aired = (string)$episode->FirstAired;
  141. $bean->imdb_id = (string)$episode->IMDB_ID;
  142. $bean->language = (string)$episode->Language;
  143. $bean->overview = (string)$episode->Overview;
  144. $bean->rating = (string)$episode->Rating;
  145. $bean->rating_count = (string)$episode->RatingCount;
  146. $bean->last_updated = (string)$episode->lastupdated;
  147. return $bean;
  148. }

问题是插入一个系列需要大约5分钟,并且它也插入重复项,执行R :: freeze();也没有帮助表现.

问:我如何解决这个问题,我能做些什么来使redbean表现更好,我可以用自己的代码做些什么来使其更好地工作,或者我应该简单地使用不同的解决方案/方法框架等?

尝试共享列表,如建议但具有相同的结果.

  1. function InsertSerie($serie) {
  2. $serieBean = $this->CreateSerieBean($serie->Series);
  3. ...
  4. foreach ($serie->Episode as $episode) {
  5. $episodeBean = $this->CreateEpisodeBean($serieBean,$episode);
  6. ...
  7. $this->CreateDirectorBeans($serieBean,$episode->Director);
  8. $serieBean->sharedEpisode[] = $episodeBean;
  9. }
  10. R::store($serieBean);
  11. }
  12.  
  13. function CreateDirectorBeans($bean,$directors) {
  14. if(empty($directors)) { return; }
  15. $director = explode("|",$directors);
  16. foreach ($director as $d) {
  17. if($d != '') {
  18. $bean->sharedDirector[] = $this->CreateDirectorBean($d);
  19. }
  20. }
  21. }
  22.  
  23. function CreateDirectorBean($director) {
  24. $bean = R::dispense('director');
  25. $bean->name = (string)$director;
  26. return $bean;
  27. }
  28. ....
我终于找到了如何将执行时间从5分钟降低到大约11秒,仍然需要花费一些时间,但考虑到数据量和工作量,我认为它对硬件有利.

添加了这些代码

  1. R::Begin();
  2. R::associate($bean1,$bean2);
  3. ...
  4. R::commit();

现在它收集所有工作并在一个大的事务中执行它,如工作单元模式.另外为了防止插入重复,我切换到使用

  1. $bean = R::findOrDispense($type,$sql,$values);

然后我只返回bean,如果它已经存在,如果不是我创建一个新的并返回它.

猜你在找的PHP相关文章