PHP implémente le code de vente flash

小云云
Libérer: 2023-03-20 07:02:01
original
10564 Les gens l'ont consulté

À la demande du groupe, nous avons créé une fonction de vente flash pour le compte de service. Nous avions besoin de tester la vente flash. Je voulais essayer le multi-threading PHP, j'ai donc simulé la fonction de saisie de commandes. Cet article partage principalement avec vous une simulation multithread PHP pour réaliser la fonction de vente flash et de saisie de commandes. Il a une certaine valeur de référence. Les amis intéressés peuvent s'y référer.

Parlons d'abord de l'idée du module de vente flash :

Opération de vente flash utilisateur dans des circonstances normales

1. demande de vente
2. Entrez dans la file d'attente des ventes flash
3. Retard aléatoire de 1 à 2 secondes pour la demande de requête de résultat de vente flash (cela peut être considéré comme un détournement déguisé)
4. 🎜>5. Retourner les résultats

Les éléments suivants sont le code pour simuler la vente flash :


<?php


set_time_limit(0);

/**
* 线程的执行任务
*/
class Threadrun extends Thread
{
  public $url;
  public $data;
  public $params;

  public function __construct($url, $params=[])
  {
   $this->url = $url;
   $this->params = $params;
  }

  public function run()
  {
   if(($url = $this->url))
   {
     $params = [
      &#39;goods_id&#39;  => 1,
      &#39;activity_id&#39;  => 1,
      &#39;user_id&#39;   => isset($this->params[&#39;user_id&#39;]) ? $this->params[&#39;user_id&#39;] : $this->getCurrentThreadId(),
     ];
     $startTime = microtime(true);
     $this->data = [
      &#39;id&#39;   => $params[&#39;user_id&#39;],
      &#39;result&#39;  => model_http_curl_get( $url, $params ),
      &#39;time&#39;  => microtime(true)-$startTime,
      &#39;now&#39;   => microtime(true),
     ];
   }
  }
}

/**
* 执行多线程
*/
function model_thread_result_get($urls_array)
{
  foreach ($urls_array as $key => $value)
  {
   $threadPool[$key] = new Threadrun($value["url"],[&#39;user_id&#39;=>$value[&#39;user_id&#39;]]);
   $threadPool[$key]->start();
  }
  foreach ($threadPool as $thread_key => $thread_value)
  {
   while($threadPool[$thread_key]->isRunning())
   {
     usleep(10);
   }
   if($threadPool[$thread_key]->join())
   {
     $variable_data[$thread_key] = $threadPool[$thread_key]->data;
   }
  }
  return $variable_data;
}

/**
* 发送 HTTP 请求
*/
function model_http_curl_get($url,$data=[],$userAgent="")
{
  $userAgent = $userAgent ? $userAgent : &#39;Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2)&#39;;
  $curl = curl_init();
  curl_setopt($curl, CURLOPT_URL, $url);
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($curl, CURLOPT_TIMEOUT, 5);
  curl_setopt($curl, CURLOPT_USERAGENT, $userAgent);
  curl_setopt($curl, CURLOPT_POST, true);
  if( !empty($data) ) {
   curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
  }
  $result = curl_exec($curl);
  curl_close($curl);
  return $result;
}


/**
 * 友好的打印变量
 * @param $val
 */
function dump( $val )
{
  echo &#39;<pre class="brush:php;toolbar:false">&#39;;
  var_dump($val);
  echo &#39;
'; } /** * 写日志 * @param $msg * @param string $logPath */ function writeLog( $msg, $logPath='' ) { if( empty($logPath) ) { $logPath = date('Y_m_d').'.log'; } if( !file_exists($logPath) ) { $fp = fopen( $logPath,'w' ); fclose( $fp ); } error_log( $msg.PHP_EOL, 3, $logPath); } /** * 生成日志信息 * @param $result * @param $timeDiff * @return bool|string */ function createLog( $result, $timeDiff ){ if( empty($result) || !is_array($result) ) { return false; } $succeed = 0; $fail = 0; foreach( $result as $v ) { $times[] = $v['time']; $v['result'] === false ? $fail++ : $succeed++; } $totalTime = array_sum( $times ); $maxTime = max( $times ); $minTime = min( $times ); $sum = count( $times ); $avgTime = $totalTime/$sum; $segment = str_repeat('=',100); $flag = $segment . PHP_EOL; $flag .= '总共执行时间:' . $timeDiff . PHP_EOL ; $flag .= '最大执行时间:' . $maxTime . PHP_EOL; $flag .= '最小执行时间:' . $minTime . PHP_EOL; $flag .= '平均请求时间:' . $avgTime . PHP_EOL; $flag .= '请求数:' . $sum . PHP_EOL; $flag .= '请求成功数:' . $succeed . PHP_EOL; $flag .= '请求失败数:' . $fail . PHP_EOL; $flag .= $segment . PHP_EOL; return $flag; } /** * 发起秒杀请求 */ function insertList( $urls, $logPath='' ) { $t = microtime(true); $result = model_thread_result_get($urls); $e = microtime(true); $timeDiff = $e-$t; echo "总执行时间:" . $timeDiff . PHP_EOL; foreach( $result as $v ) { $msg = '用户【' . $v['id'] . '】秒杀商品, 返回结果 ' . $v['result'] . ' 用时【' . $v['time'] . ' 秒】 当前时间【'.$v['now'].'】'; writeLog( $msg,$logPath ); } $logStr = createLog( $result, $timeDiff); writeLog( $logStr, $logPath ); return $result; } //发起秒杀请求 for ($i=0; $i < 1000; $i++) { $urls_array[] = array("name" => "baidu", "url" => "http://***.***.com/seckill/shopping/listinsert"); } $list = insertList( $urls_array, './inset.log' ); //发起秒杀结果查询请求 $urls_array = []; foreach( $list as $v ) { if( $v['result'] === false ) { continue; } $urls_array[] = array( "name" => "baidu", "url" => "http://***.***.com/seckill/shopping/query", 'user_id' => $v['id'], ); } insertList( $urls_array, './query.log' );
Copier après la connexion
Tester les performances de la machine de code (machine de développement) :

Code de commande Performance de la machine (machine de test) :

Résultats des tests du système :

Simulant 1 000 situations simultanées, une seule machine peut traiter plus de 300 commandes par seconde et le serveur n'a aucune pression.

Au contraire, la machine de test n'a pas pu le supporter, et le CPU a bondi de 100 %. Apache plante parfois.

Je ne sais pas si c'est le mauvais support du multi-thread PHP et de l'environnement Windows, ou le problème du multi-thread PHP lui-même, mais seuls 1000 threads ne peuvent pas s'exécuter. Le multithreading nécessite toujours Python et C.

Recommandations associées :


PHP et Redis réalisent le partage de code de la fonction de vente flash dans les centres commerciaux

Le script JS réalise le flash automatique des pages Web Partage d'exemples de vente

Recommandation de ressources vidéo mise en œuvre par la fonction de vente flash de produits du site Web de commerce électronique PHP

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal