public function adsProcess() { $responseType = ''; $expandFields = array(); $zoneID = Input::get('zid', 0); $publisherID = Input::get('pid', 0); $requestType = Input::get('type', Delivery::REQUEST_TYPE_AD); $trackingModel = new Tracking(); $deliveryModel = new Delivery(); $flightDateModel = new FlightDateBaseModel(); //ghi log trước khi xử lý $logPreProcess = $trackingModel->logPreProcess($requestType); if ($logPreProcess) { //kiểm tra referrer $hostReferer = $trackingModel->getRequestReferer(); if (empty($zoneID)) { $responseType = Delivery::RESPONSE_TYPE_INVALID; } elseif (empty($hostReferer)) { $responseType = Delivery::RESPONSE_TYPE_EMPTY_REFERRER; } elseif ($trackingModel->countLatestRequest(1) < Delivery::ANTI_CHEAT_MAX_REQUEST_PER_1MIN && $trackingModel->countLatestRequest(5) < Delivery::ANTI_CHEAT_MAX_REQUEST_PER_5MIN) { $responseType = Delivery::RESPONSE_TYPE_ANTI_MANY_REQUEST; } //pre validate ok if (empty($responseType)) { //default invalid if ($zoneID && $publisherID) { $adZone = PublisherAdZoneBaseModel::find($zoneID); if ($adZone && $adZone->publisher) { if ($adZone->publisher_id == $publisherID) { $flightPublishers = FlightPublisherBaseModel::where('publisher_id', $publisherID)->with('flightDate', function ($query) { $today = date('Y-m-d'); $query->where('start', '<=', $today)->where('end', '>=', $today); })->where('publisher_ad_zone_id', $zoneID)->orderBy('order', 'asc')->get(); if ($flightPublishers) { if ($requestType == Delivery::REQUEST_TYPE_AD) { //lấy ad từ list thỏa điều kiện để trả về foreach ($flightPublishers as $k => $flightPublisher) { if ($flightPublisher->flightDate) { $runningInventory = $trackingModel->runningInventory($flightPublisher->id); if ($flightPublisher->total_inventory < $runningInventory) { $deliveryStatus = $deliveryModel->deliveryAd($flightPublisher->ad, $flightPublisher->flight); if ($deliveryStatus == Delivery::DELIVERY_STATUS_OK) { //trả về ad này $serveAd = $flightPublisher->ad; $expandFields = array('flight_id' => $flightPublisher->flight_id, 'ad_format_id' => $flightPublisher->ad_format_id, 'ad_id' => $flightPublisher->ad_id, 'campaign_id' => $flightPublisher->campaign_id, 'publisher_ad_zone_id' => $flightPublisher->publisher_ad_zone_id, 'flight_publisher_id' => $flightPublisher->id, 'publisher_id' => $flightPublisher->publisher_id, 'flight_publisher_id' => $flightPublisher->id); break; } } } } //endforeach } elseif ($requestType == Delivery::REQUEST_TYPE_TRACKING_BEACON) { //tracking beacon TO DO, now : do nothing if ($trackingModel->isKnownVisitor()) { } else { $responseType = Delivery::RESPONSE_TYPE_EMPTY_REFERRER; } } } } //serve Ad if (!empty($serveAd)) { } else { } } } } } if (empty($responseType)) { $responseType = Delivery::RESPONSE_TYPE_INVALID; } //ghi log process $trackingModel->logAfterProcess($responseType, $expandFields); return $deliveryModel->emptyAd(); }
public function adsProcess() { //Cache::flush(); $startProcess = microtime(1); ignore_user_abort(true); $this->layout = null; $response = null; $responseType = ''; $expandFields = array(); $deliveryStatus = ''; $requestType = Input::get('rt', Delivery::REQUEST_TYPE_AD); $flightWebsiteID = Input::get('fpid', 0); $zoneID = Input::get('zid', 0); $websiteID = Input::get('wid', 0); $data = Input::all(); $trackingModel = new Tracking(); $deliveryModel = new Delivery(); $vast = new Advalue\VAST(); $isOverReport = $data['ovr'] = false; //ghi log trước khi xử lý $logPreProcess = $trackingModel->logPreProcess($requestType, $data); if ($logPreProcess) { //kiểm tra referrer $hostReferer = $trackingModel->getRequestReferer(); $responseType = $trackingModel->checkPreProcess($requestType, $hostReferer, $zoneID); //pre validate ok if (empty($responseType)) { $adZone = $deliveryModel->getAdzone($zoneID); if (isset($data['type'])) { $data['type'] = strtolower($data['type']); } if ($zoneID && $websiteID) { if ($adZone && !empty($adZone->site)) { $expandFields['ad_format_id'] = $adZone->ad_format_id; if ($adZone->publisher_site_id == $websiteID) { //kiểm tra referrer đúng với site đã đăng ký // if(1){//test only if (isSameDomain($hostReferer, getWebDomain($adZone->site->url)) || Input::get('ec') == 0 || isLocal()) { $flightWebsites = $deliveryModel->getAvailableAds($adZone->publisher_site_id, $adZone->ad_format_id); // shuffle($flightWebsites); if ($flightWebsites) { //sort available flights base on priority and retargeting //TO DO retargeting $flightWebsites = $deliveryModel->sortAvailableFlightWebsites($flightWebsites); //lấy ad từ list thỏa điều kiện để trả về $deliveryInfo = $deliveryModel->getFullFlightInfo($flightWebsites, $adZone->publisher_site_id, $adZone->ad_format_id); foreach ($flightWebsites as $k => $flightWebsite) { if (!empty($deliveryInfo['flightDates'][$flightWebsite->flight_id]) && !empty($deliveryInfo['flights'][$flightWebsite->flight_id])) { $flightDates = $deliveryInfo['flightDates'][$flightWebsite->flight_id]; $flight = $deliveryInfo['flights'][$flightWebsite->flight_id]; $ad = $deliveryInfo['ads'][$flight->ad_id]; $checkFlightDate = $deliveryModel->checkFlightDate($flightDates, $flight); //flight date ok if ($checkFlightDate) { $deliveryStatus = $deliveryModel->deliveryAd($ad, $flightWebsite, $flight, $flightDates); if ($deliveryStatus == Delivery::DELIVERY_STATUS_OK || $deliveryStatus == Delivery::DELIVERY_STATUS_OVER_REPORT) { //pr($flight); //trả về ad này $serveAd = $ad; $data['ad'] = $ad; $data['aid'] = $ad->id; $data['fpid'] = $flightWebsite->id; //over report if ($deliveryStatus == Delivery::DELIVERY_STATUS_OVER_REPORT) { $data['ovr'] = $isOverReport = true; } $responseType = Delivery::RESPONSE_TYPE_ADS_SUCCESS; // update number show retargeting $url = $flight->retargeting_url; if ($url != "") { $campaign = $deliveryModel->getCampaign($flight->campaign_id); $tracking = new Tracking(); $key = "Retargeting:{$campaign->advertiser_id}:{$tracking->getVisitorId()}"; $cache = RedisHelper::get($key); if (isset($cache->{$url})) { $keyNumberTarget = "RetargetingNumber:{$campaign->advertiser_id}:{$flight->id}:{$flight->ad_id}:{$tracking->getVisitorId()}"; $cacheNumberTarget = RedisHelper::get($keyNumberTarget); if ($cacheNumberTarget) { RedisHelper::increment($keyNumberTarget); } else { RedisHelper::set($keyNumberTarget, 1); } } } break; } } } } //endforeach } //no ads available if ($responseType != Delivery::RESPONSE_TYPE_ADS_SUCCESS) { $responseType = Delivery::RESPONSE_TYPE_NOT_AVAILABLE; } } else { $responseType = Delivery::RESPONSE_TYPE_REFERRER_NOT_MATCH; } } } } } } //invalid ads request if (empty($responseType)) { $responseType = Delivery::RESPONSE_TYPE_INVALID; } elseif ($responseType == Delivery::RESPONSE_TYPE_ADS_SUCCESS) { $expandFields = array('flight_id' => $flightWebsite->flight_id, 'ad_format_id' => $adZone->ad_format_id, 'ad_id' => $flight->ad_id, 'campaign_id' => $flight->campaign_id, 'publisher_ad_zone_id' => $adZone->id, 'flight_website_id' => $flightWebsite->id, 'website_id' => $flightWebsite->website_id); if ($isOverReport) { $expandFields['ovr'] = 1; } $expandFields['checksum'] = $checksum = $trackingModel->makeChecksumHash($flightWebsite->id, $trackingModel->created_at); $eventChecksum = Delivery::RESPONSE_TYPE_ADS_SUCCESS; $trackingModel->setChecksumTrackingEvent($checksum, Delivery::RESPONSE_TYPE_ADS_SUCCESS); (new RawTrackingSummary())->addSummary('ads_request', $flightWebsite->website_id, $adZone->id, $adZone->ad_format_id, $flightWebsite->flight_id, $flightWebsite->id, $flight->ad_id, $flight->campaign_id); } //serve Ad // if(0){ if (!empty($serveAd)) { View::addLocation(base_path() . '/frontend/theme/default/views/delivery'); if (isset($data['ec'])) { if ($data['ec'] == 1) { $data['checksum'] = $expandFields['checksum']; $this->data['data'] = $data; $data['type'] = $serveAd->ad_view ? $serveAd->ad_view : strtolower($data['type']); if (Input::get('test') == 1) { return View::make($data['type'], $this->data); } else { $response = Response::view($data['type'], $this->data)->header('Content-Type', 'text/javascript; charset=UTF-8'); } } else { $response = $vast->makeVAST($data['aid'], $data['fpid'], $data['zid'], $expandFields['checksum'], $isOverReport); } } } else { //TO DO : return backup ads if (!empty($adZone)) { $alternateAds = $deliveryModel->getAlternateAds($adZone->id); if (isset($adZone) && $alternateAds) { if (isset($data['ec']) && !$data['ec']) { $response = $vast->makeEmptyVast(); } else { $this->data['listAlternateAd'] = $alternateAds; $this->data['zid'] = $adZone->id; View::addLocation(base_path() . '/frontend/theme/default/views/delivery'); $response = Response::view('rotator', $this->data)->header('Content-Type', 'text/javascript; charset=UTF-8'); } } else { if (isset($data['ec']) && !$data['ec']) { $response = $vast->makeEmptyVast(); } } (new RawTrackingSummary())->addSummaryRequestEmptyAd($adZone->id, $adZone->ad_format_id, $websiteID); } } //ghi log process $trackingModel->logAfterProcess($responseType, $expandFields, $logPreProcess); //response to client $endProcess = microtime(1); pr($deliveryStatus); pr($responseType, 1); return $response; }