[PHP] Code optimalisatie

Pagina: 1
Acties:

  • FireFoz
  • Registratie: Juni 2001
  • Laatst online: 31-08 23:38
Hoi,

Ik heb een referal systeem gemaakt. Deze draaid al zo'n 3 maanden probleemloos, maar nu mijn traffic hoger is dan in het begin, is het belangrijk dat dit script zo snel mogelijk is, en de server zo min mogelijk belast. Ik zou niet weten hoe ik deze code sneller zou kunnen maken, maar misschien dat een van julie een manier weet waarop het sneller is?

Afin, hier is mn systeem + code.

1. in.php, elke bezoeker komt binnen via deze file, bijvoobeeld http://www.mijnsite.com/in.php?siteid=henk
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<?php
include("dbconnect.inc.php");

    $ip = $REMOTE_ADDR;

    $query = ("SELECT ip FROM ips WHERE ip = '$ip' AND site = 'tb'");
    $result = mysql_query($query);
    $ipdb = mysql_fetch_array($result);


if($ip == $ipdb[0])
{
}
else
{
    $query = ("SELECT enabled FROM sites WHERE siteid = '$siteid'");
    $result = mysql_query($query);
    $enabled = mysql_fetch_array($result);

    if($enabled[0] == yes)
    {

        $month = date("m");
        $day = date("z");

        $query = ("INSERT INTO ips (ip, month, site) VALUES ('$ip', '$month', 'tb')");
        $result1 = mysql_query($query);

        $query = ("SELECT tb FROM stats WHERE id = '$siteid' AND day='$day'");
        $result = mysql_query($query);
        $tb = mysql_fetch_array($result);

        if($tb[0]==(NULL))
        {
            $query = ("INSERT INTO stats (id, day, tb) VALUES ('$siteid', '$day', '1')");
            $result1 = mysql_query($query);
        }
        else
        {
            $tb_new = ($tb[0]+1);
     
            $query = ("UPDATE stats SET  tb = '$tb_new' WHERE id = '$siteid' AND day = '$day'");
            $result1 = mysql_query($query);

            $datum= time();
            $query = ("UPDATE sites SET  lasthit = '$datum' WHERE siteid = '$siteid'");
            $result1 = mysql_query($query);

        }
    }
    else
    {
    }
}
header("Location: http://www.mijnsite.com");
?>

Ik heb dus 2 tabellen. In 1 tabel staan alle sites met de daarbij behorende info, zoals url, naam, email etc. Ook staat daar in of de site "enabled" is. Als dit "no" is dan is de site niet actief en moet ie dus "disabled" zijn. Dus daar moet op gecheckt worden. Het systeem werkt zo, dat op basis van de hits die een site vandaag stuurt, de site morgen geplaatst word. Als ie dus vandaag 3e is, staat ie morgen pas als 3e op de site. De site loopt dus 1 dag achter zeg maar.

In de 2e tabel, staat de dag, plus een paar andere velden, voor elke site die ik heb 1 veld. Ik heb dus een centrale database. In het geval van deze code is dit veld "tb". Op mn andere sites is de code dus precies hetzelfde maar dan is "tb" iets anders. Dit ff zodat je de code een beetje begrijpt :).

Dan op mijn site zelf, daar heb ik dus een top 20.
Hier is die code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
<table border="0" cellspacing="0" cellpadding="0" width='80%'>
        <tr>
          <td colspan="3" width='300'>[img]'images/top_referals.jpg'><BR>
        [/img]
        </tr>
        <tr>
          <td>
<?php 
include("dbconnect.inc.php");

$i = 0;
$rank = 1;
$day = date("z");
$day = $day - 1;

$query = "SELECT id FROM stats WHERE tb > 0 AND day = '$day' ORDER by tb DESC limit 5";
$result = mysql_query($query);

while($record = mysql_fetch_object($result))
{
    $query2 = "SELECT title, url FROM sites WHERE siteid='$record->id'";
    $result2 = mysql_query($query2);
    while ($record2 = mysql_fetch_object($result2))
    {
        $titel = $record2->title;
        $url = $record2->url;
        print("<font face='Arial, Helvetica, sans-serif' size='2'><b>$rank </b><a href='$url' target='_blank'>$titel</a><br>");
        $rank++;
    }
}
print("</td><td width='8'></td><td>");

$i = 0;
//$rank = 6;

$query = "SELECT id FROM stats WHERE tb > 0 AND day = '$day' ORDER by tb DESC limit 5,5";
$result = mysql_query($query);

while($record = mysql_fetch_object($result))
{
    $query2 = "SELECT title, url FROM sites WHERE siteid='$record->id'";
    $result2 = mysql_query($query2);
    while ($record2 = mysql_fetch_object($result2))
    {
        $titel = $record2->title;
        $url = $record2->url;
        print("<font face='Arial, Helvetica, sans-serif' size='2'><b>$rank </b><a href='$url' target='_blank'>$titel</a><br>");
        $rank++;
    }
}

print("</td></tr></table><br><center>
<table border='0' cellspacing='0' cellpadding='0' width='80%'><tr><td>");

$i = 0;

$query = "SELECT id FROM stats WHERE tb > 0 AND day = '$day' ORDER by tb DESC limit 10,5";
$result = mysql_query($query);

while($record = mysql_fetch_object($result))
{
    $query2 = "SELECT title, url FROM sites WHERE siteid='$record->id'";
    $result2 = mysql_query($query2);
    while ($record2 = mysql_fetch_object($result2))
    {
        $titel = $record2->title;
        $url = $record2->url;
        print("<font face='Arial, Helvetica, sans-serif' size='2'><b>$rank </b><a href='$url' target='_blank'>$titel</a><br>");
        $rank++;
    }
}
print("</td><td width='7'></td><td>");

$i = 0;
//$rank = 6;

$query = "SELECT id FROM stats WHERE tb > 0 AND day = '$day' ORDER by tb DESC limit 15,5";
$result = mysql_query($query);

while($record = mysql_fetch_object($result))
{
    $query2 = "SELECT title, url FROM sites WHERE siteid='$record->id'";
    $result2 = mysql_query($query2);
    while ($record2 = mysql_fetch_object($result2))
    {
        $titel = $record2->title;
        $url = $record2->url;
        print("<font face='Arial, Helvetica, sans-serif' size='2'><b>$rank </b><a href='$url' target='_blank'>$titel</a><br>");
        $rank++;
    }
}


?>
</td>
        </tr>
        </table>

Dr zit aardig wat html bij, maar daar moet je maar ff niet op letten, het gaat puur om de php code.

Dat is dus de top 20, van 2x2 rijen van 5.

Dan heb ik ook nog de rest, dat zijn 2 rijen van 10. Hier is die code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<BR><center><table border="0" cellpadding="0" cellspacing="5" width="70%"><tr><td width="100%" colspan="2"><font size='2'><CENTER><B>Other Great Sites</B><BR><BR></CENTER></td></tr>
<tr><td width="60%"><font face='Arial, Helvetica, sans-serif' size='2'>
<?php

include("dbconnect.inc.php");

$i = 0;
$day = date("z");
$day = $day - 1;

$query = "SELECT id FROM stats WHERE tb > 0 AND day = '$day' ORDER by tb DESC LIMIT 20, 10";
$result = mysql_query($query);

while($record = mysql_fetch_object($result))
{
    $query2 = "SELECT title, url FROM sites WHERE siteid='$record->id'";
    $result2 = mysql_query($query2);
    while ($record2 = mysql_fetch_object($result2))
    {
        $titel = $record2->title;
        $url = $record2->url;
        print("<a href='$url' target='_blank'>$titel</a><br>");
    }
}

print("</td><td width='40%' valign='top'><font face='Arial, Helvetica, sans-serif' size='2'>");

$i = 0;

$query = "SELECT id FROM stats WHERE tb > 0 AND day = '$day' ORDER by tb DESC LIMIT 30, 10";
$result = mysql_query($query);

while($record = mysql_fetch_object($result))
{
    $query2 = "SELECT title, url FROM sites WHERE siteid='$record->id'";
    $result2 = mysql_query($query2);
    while ($record2 = mysql_fetch_object($result2))
    {
        $titel = $record2->title;
        $url = $record2->url;
        print("<a href='$url' target='_blank'>$titel</a><br>");
    }
}
?>
</td></tr></table></center>

Whoa, het is heel wat code, en ik vind het al knap van mezelf dat ik dit heb kunnen maken, en dat het ook nog werkt :). Ik ben ongeveer 4 maanden geleden begonnen met php, dus zo slecht is het nog niet :P.

Naja, weet iemand dus hoe ik deze code sneller kan maken? in.php word zon 13000 keer per dag gerunt, en die andere 2 nog vaker...dus het is wel belangrijk dat ie zo snel is als het maar kan :)

TNX!!!

Leef lekker in het nu, er is niks anders


  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 13:20
Ik wil iig even zeggen dat je php code er super netjes uit ziet.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?php
include("dbconnect.inc.php");
    $ip = $REMOTE_ADDR;

    $query = ("SELECT ip FROM ips WHERE ip = '$ip' AND site = 'tb'");
    $result = mysql_query($query);
    $ipdb = mysql_fetch_array($result);


if($ip != $ipdb[0])
{
    $query = ("SELECT enabled FROM sites WHERE siteid = '$siteid'");
    $result = mysql_query($query);
    $enabled = mysql_fetch_array($result);

    if($enabled[0] == yes)
    {

        $month = date("m");
        $day = date("z");

        $query = ("INSERT INTO ips (ip, month, site) VALUES ('$ip', '$month', 'tb')");
        $result1 = mysql_query($query);

        $query = ("SELECT tb FROM stats WHERE id = '$siteid' AND day='$day'");
        $result = mysql_query($query);
        $tb = mysql_fetch_array($result);

        if($tb[0]==(NULL))
        {
            $query = ("INSERT INTO stats (id, day, tb) VALUES ('$siteid', '$day', '1')");
            $result1 = mysql_query($query);
        }
        else
        {
            $tb_new = ($tb[0]+1);
     
            $query = ("UPDATE stats SET  tb = '$tb_new' WHERE id = '$siteid' AND day = '$day'");
            $result1 = mysql_query($query);

            $datum= time();
            $query = ("UPDATE sites SET  lasthit = '$datum' WHERE siteid = '$siteid'");
            $result1 = mysql_query($query);

        }
    }
    else
    {
    }
}
header("Location: http://www.mijnsite.com");
?>

Kan ook worden:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<?php
include("dbconnect.inc.php");
    $ip = $REMOTE_ADDR;

    $query = ("SELECT ip FROM ips WHERE ip = '$ip' AND site = 'tb'");
    $result = mysql_query($query);
    $ipdb = mysql_fetch_array($result);


if($ip == $ipdb[0])
{
}
else
{
    $query = ("SELECT enabled FROM sites WHERE siteid = '$siteid'");
    $result = mysql_query($query);
    $enabled = mysql_fetch_array($result);

    if($enabled[0] == yes)
    {

        $month = date("m");
        $day = date("z");

        $query = ("INSERT INTO ips (ip, month, site) VALUES ('$ip', '$month', 'tb')");
        $result1 = mysql_query($query);

        $query = ("SELECT tb FROM stats WHERE id = '$siteid' AND day='$day'");
        $result = mysql_query($query);
        $tb = mysql_fetch_array($result);

        if($tb[0]==(NULL))
        {
            $query = ("INSERT INTO stats (id, day, tb) VALUES ('$siteid', '$day', '1')");
            $result1 = mysql_query($query);
        }
        else
        {
            $tb_new = ($tb[0]+1);
     
            $query = ("UPDATE stats SET  tb = '$tb_new' WHERE id = '$siteid' AND day = '$day'");
            $result1 = mysql_query($query);

            $datum= time();
            $query = ("UPDATE sites SET  lasthit = '$datum' WHERE siteid = '$siteid'");
            $result1 = mysql_query($query);

        }
    }
    else
    {
    }
}
header("Location: http://www.mijnsite.com");
?>

Want dat if is een beetje raar, zoals in de 1e situatie.

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<?
include("dbconnect.inc.php");
      $ip = $REMOTE_ADDR;

      $query = sprintf("SELECT ip FROM ips WHERE ip = '%s' AND site = 'tb'", $ip);
      $result = mysql_query($query);
      //$ipdb = mysql_fetch_array($result);


if(mysql_num_rows($result) < 1)
// {
// }
// else
{
      $query = sprintf("SELECT 1 FROM sites WHERE enabled='yes' and siteid = '%s'", $siteid);
      $result = mysql_query($query);
      // $enabled = mysql_fetch_array($result);

      if(mysql_num_rows($result) < 1)
      {

           // $month = date("m"); Niet Nodig kan je de DB ook laten doen
           // $day = date("z"); zelfde kan je ook de DB laten doen

            $query = sprintf("INSERT INTO ips (ip, month, site) VALUES ('%s', MONTH(NOW()), 'tb')",$ip);
            $result = mysql_query($query);

            $query = sprintf("SELECT 1 FROM stats WHERE id = '%s' AND day=DAY(NOW())",$siteid);
            $result = mysql_query($query);
            // $tb = mysql_fetch_array($result); Waarom FETCHEN RESULTAAT is niet nodig

            if(mysql_num_rows($result) < 1)
            {
                  $query = sprintf("INSERT INTO stats (id, day, tb) VALUES ('%s', DAY(NOW()), '1')", $siteid);
                  $result = mysql_query($query);
            }
            else
            {
                  // $tb_new = ($tb[0]+1); DATABASE KAN DAT BEST ZELF
       
                  $query = sprintf("UPDATE stats SET  tb = tb + 1 WHERE id = '%s' AND day = DAY(NOW())", $siteid);
                  $result = mysql_query($query);

                  // $datum= time(); TRUST THE DB :)
                  $query = sprintf("UPDATE sites SET  lasthit = UNIX_TIMESTAMP(NOW()) WHERE siteid = '%s'", $siteid);
                  $result = mysql_query($query);

            }
      }
 //     else ELSE STATEMENT IS NIET VERPLICHT, DENK NIET DAT HET SNELLER DOOR WORDT
 //     {
 //     }
}
header("Location: http://www.mijnsite.com");
?>

Geen idee of het echt sneller is.... maar dit is meer hoe ik het zou doen....

Programmer - an organism that turns coffee into software.


  • Grum
  • Registratie: Juni 2001
  • Niet online
aller eerst .. even complimenten over de netheid van de code :) nice job!

Dit is alleen over het eerste brok code .. de rest doe ik zo :P staat nu comment over helemaal onderaan me post

PS: dit is niet 100% foutvrij .. niet getest dus >:)

PS2: LuCard
* UNIX_TIMESTAMP() werkt ook zonder NOW()
* DAY(NOW()) werkt niet :? (MONTH(NOW()) wel btw
code:
1
2
mysql> select DAY(NOW());
ERROR 1064: You have an error in your SQL syntax near '(NOW())' at line 1


PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
<?
include("dbconnect.inc.php");
 
$ip = $REMOTE_ADDR; // als iemand door een proxy komt wil je (ik meen) $HTTP_X_FORWARDED_FOR hebben
 
// je gebruikt maar 1 ip, dus limit 1
// de () om de assignment mag weg ;)
$query = "SELECT ip FROM ips WHERE ip = '$ip' AND site = 'tb' limit 1";
$result = mysql_query($query);
 
// over het algemeen is het sneller om een mysql_result($result,0,0) te doen
// om 1 veldje op te halen
 
// php manual: http://www.php.net/manual/en/function.mysql-result.php
// When working on large result sets, you should consider using one of the functions 
// that fetch an entire row (specified below). As these functions return the contents 
// of multiple cells in one function call, they're MUCH quicker than mysql_result(). 
// Also, note that specifying a numeric offset for the field argument is much quicker 
// than specifying a fieldname or tablename.fieldname argument. 
 
$ipdb = mysql_result($result,0,0);
 
// rare if :) (ps de $ipdb[0] id nu gewoon $ipdb)
 
// gniffel .. ik snap nu wat je precies bedoeld!
 
// je wil alleen weten of het al ip bestaat ... of niet :P
// knip alles na $ip weg tot aan het 'else' blok
 
// NEW!
$query = "SELECT count(ip) as num FROM ips WHERE ip = '$ip' AND site = 'tb'";
result = mysql_query($query);
$ipdb = mysql_result($result,0,0);
 
if(!$ipdb)
// NEW!
 
// dat is de snelste 'officele' methode
// het zou ook nog anders kunnen nl.:
 
// $query = "SELECT ip FROM ips WHERE ip = '$ip' AND site = 'tb' limit 1";
// $result = mysql_query($query);
// if(!mysql_num_rows)
 
// het is begrijpelijk dat deze query sneller is op een gigantische table waar ips 
// meerdere keren kunnen voorkomen etc etc etc
// in dit geval zal het wel meevallen
 
{
    // same goes here .... mysql_fetch_* is slomer dan mysql_result
    $query = "SELECT enabled FROM sites WHERE siteid = '$siteid'";
    $result = mysql_query($query);
    $enabled = mysql_result($result,0,0);
 
    // JIKES .... == yes (ZONDER quotes)
    // *** (1) *** <--- voor de tips later on :P
    if($enabled == 'yes')
    {
 
        $month = date("m");
        $day = date("z");
 
        // ps je kan gewoon steeds '$result' gebruiken (dus niet eerst $result dan $result1 :P)
        $query = ("INSERT INTO ips (ip, month, site) VALUES ('$ip', '$month', 'tb')");
        $result = mysql_query($query);
 
        // weirde haakjes >:)
        $query = ("SELECT tb FROM stats WHERE id = '$siteid' AND day='$day'");
        $result = mysql_query($query);
        // wederom een fetch_array
        $tb = mysql_result($result,0,0);
 
        // hier beneden zie ik veel weirds ...
        // *** (2) ***
 
        // rare haakjes ;)
        if($tb==(NULL))
        {
            //   again rare haakjes :)
            $query = ("INSERT INTO stats (id, day, tb) VALUES ('$siteid', '$day', '1')");
            $result1 = mysql_query($query);
        }
        else
        {
            // oe oe oe ! rare haakjes :P
            $tb_new = ($tb+1);
     
            // again haakjes ?
            $query = ("UPDATE stats SET  tb = '$tb_new' WHERE id = '$siteid' AND day = '$day'");
            $result = mysql_query($query);
 
            $datum = time();
            
            // laat me raden .. er stond eerst overal mysql_query(....) met de query er direct in :P
            $query = ("UPDATE sites SET  lasthit = '$datum' WHERE siteid = '$siteid'");
            $result = mysql_query($query);
 
        }
    }
    // lege else hier ? .. weg ermee!
    // else
    // {
    // }
}
header("Location: http://www.mijnsite.com");
?>


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
TIPS:

1/ een tabel met 'text' yes/no dat is niet echt 'efficient' .. ik zou er een 
   tinyint van maken die alleen op 0/1 kan (uit/aan)
2/ Ok .. dit word lang >:)

   je hele idee is volges mij dit:
   * bestaat et IP niet dan:
     - insert + maand + jaar
     * bestaat er al een 'count' entry voor vandaag?
     - NEE: 
          - aanmaken!
     - JA :
          - updaten
     - last hit zetten 
 
   ik neem tenminste aan ... dat als er nog geen count entry bestaat en je maakt 
   em aan dat er dan alsnog een lasthit mag/moet zijn :P

   de if-conditie $td == NULL komt nogal raar over, alsof er altijd iets ingevuld 
   zou zijn .. voor elke dag ... met een NULL value     
 
   als dat zo is:
   - default em naar 0 dan aub :)
 
   zo niet .. dan kan je het anders doen (dit is ook zo .. aangezien je em later insert)
   bv zo:


PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?
$query = "SELECT tb FROM stats WHERE id = '$siteid' AND day = '$day'";
$result = mysql_query($query);

if(mysql_num_rows($result))
{
   // we hebbe results!
   $query = "UPDATE stats SET tb = tb+1 WHERE id = '$siteid' AND day = '$day'";
   // nix opslaan .. je doet er toch geen fuck mee :P
   mysql_query($query); 
}
else
{
   // geen results ? :(
   $query = "INSERT INTO stats (id, day, tb) VALUES ('$siteid', '$day', '1')";
   // same goes here ... nix opslaan .. zonde
   mysql_query($query);
}

// nu de last hit nog (zonder $datum = time();)
$query = "UPDATE sites SET lasthit = UNIX_TIMESTAMP() WHERE siteid = '$siteid'";
mysql_query($query);
?>


heel kort over de rest van de code ...
:? :? :? WAAROM ZOVEEL QUERIES! :? :? :?

duidelijk zat lijkt me :P

haal alles in 1x op .. en verwerk het dan met php ... WAAAY sneller

  • FireFoz
  • Registratie: Juni 2001
  • Laatst online: 31-08 23:38
hey echt super bedankt, ik ga nu alles ff rustig door lezen (eerst ff lunchen :) ) en dan verwerken. Nogmaal heel erg bedankt voor alle tijd die je er in hebt gestoken!

Leef lekker in het nu, er is niks anders


  • Grum
  • Registratie: Juni 2001
  • Niet online
Op maandag 01 oktober 2001 12:22 schreef FireFoz het volgende:
hey echt super bedankt, ik ga nu alles ff rustig door lezen (eerst ff lunchen :) ) en dan verwerken. Nogmaal heel erg bedankt voor alle tijd die je er in hebt gestoken!
no problem :+

optimalisatie onder php is leuk ;) (alleen zo schaars ;( )

k'hoop dat je der iets aan hebt :)

PS eerst op papier zetten wat je wil had 100% geholpen in dit geval >:)

  • FireFoz
  • Registratie: Juni 2001
  • Laatst online: 31-08 23:38
Zijn de 2e & 3e code btw niet te verbeteren?

Leef lekker in het nu, er is niks anders


  • Grum
  • Registratie: Juni 2001
  • Niet online
dat mag je zelf doen .. de main hint heb ik al gegeven onder in mijn 'mega-post' :P

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

$result zelf vrijgeven, niet laten afhandelen door PHP.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR

Pagina: 1