GoCasts آموزش Go به زبان ساده

بیش از ۱۰۰۰ شرکت‌کننده یادگیری Go و Backend رو از امروز شروع کن
ثبت‌نام دوره + تیم‌سازی

گولنگ در مقابل PHP - مقایسه Go و PHP

PHP همچنان حدود ۷۶٪ وب‌سایت‌های جهان را اجرا می‌کند. اما Go (گولنگ) به‌عنوان جایگزین مدرن و سریع مطرح شده. در این مقاله، گولنگ و PHP را از جنبه‌های مختلف مقایسه می‌کنیم.

نگاه کلی

ویژگی Go PHP
سال معرفی 2009 1995
طراح Google Rasmus Lerdorf
نوع کامپایلی، Statically typed مفسری، Dynamically typed
کاربرد اصلی Backend، DevOps، API Web Development، CMS
فریمورک محبوب Gin, Echo Laravel, Symfony

چرا PHP هنوز محبوب است؟

قبل از مقایسه، باید بدانیم چرا PHP پس از ۳۰ سال هنوز پرکاربردترین زبان وب است:

  1. WordPress - ۴۳٪ تمام وب‌سایت‌ها
  2. Laravel - فریمورک قدرتمند و محبوب
  3. هاست ارزان - هر shared hosting از PHP پشتیبانی می‌کند
  4. جامعه بزرگ - میلیون‌ها توسعه‌دهنده

سینتکس و خوانایی

PHP - آشنا و Web-friendly

<?php

class User {
    public function __construct(
        private string $name,
        private int $age
    ) {}

    public function info(): string {
        return "{$this->name} - {$this->age} سال";
    }
}

// Array operations
$numbers = [1, 2, 3, 4, 5];
$squares = array_map(fn($n) => $n ** 2, $numbers);

// Database with PDO
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$users = $pdo->query('SELECT * FROM users')->fetchAll(PDO::FETCH_ASSOC);

// JSON response
header('Content-Type: application/json');
echo json_encode(['users' => $users]);

گولنگ - ساده و صریح

package main

import (
    "database/sql"
    "encoding/json"
    "fmt"
    "net/http"
    _ "github.com/go-sql-driver/mysql"
)

type User struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func (u User) Info() string {
    return fmt.Sprintf("%s - %d سال", u.Name, u.Age)
}

func main() {
    // Database connection
    db, _ := sql.Open("mysql", "user:pass@/test")
    defer db.Close()

    http.HandleFunc("/users", func(w http.ResponseWriter, r *http.Request) {
        rows, _ := db.Query("SELECT name, age FROM users")
        defer rows.Close()

        var users []User
        for rows.Next() {
            var u User
            rows.Scan(&u.Name, &u.Age)
            users = append(users, u)
        }

        w.Header().Set("Content-Type", "application/json")
        json.NewEncoder(w).Encode(users)
    })

    http.ListenAndServe(":8080", nil)
}

مقایسه:

  • PHP: تجربه ۳۰ ساله در وب، سینتکس آشنا
  • گولنگ: ساختار واضح‌تر، error handling صریح

سرعت اجرا

بنچمارک مقایسه‌ای

تست گولنگ PHP 8.3 تفاوت
JSON Encoding 80,000 req/s 15,000 req/s گولنگ ~5x سریع‌تر
Database Query 60,000 req/s 10,000 req/s گولنگ ~6x سریع‌تر
Hello World 100,000 req/s 25,000 req/s گولنگ ~4x سریع‌تر

توجه: با PHP 8.3 و JIT، عملکرد بهتر شده ولی هنوز گولنگ سریع‌تر است. منبع: TechEmpower Benchmarks

چرا گولنگ سریع‌تر است؟

  1. کامپایل به Native Code - PHP مفسری است
  2. بدون Startup Overhead - هر request در PHP از صفر شروع می‌شود
  3. Connection Pooling داخلی - PHP هر بار reconnect می‌کند
  4. Concurrent از ابتدا - Goroutines vs PHP-FPM workers

PHP 8 بهتر شده!

PHP 8.x با JIT بهبود یافته:

  • ۲-۳x سریع‌تر از PHP 7
  • ولی هنوز ۱۰x کندتر از Go

برنده سرعت: گولنگ - به طرز چشمگیری سریع‌تر

همزمانی (Concurrency)

PHP - مدل سنتی

<?php
// PHP-FPM: هر request یک process
// محدود به تعداد workers (مثلاً 50)

// برای async، نیاز به extension یا library:
// - Swoole
// - ReactPHP
// - Amp

// مثال با Swoole
$server = new Swoole\HTTP\Server("0.0.0.0", 9501);

$server->on("request", function ($request, $response) {
    // این async است!
    go(function () use ($response) {
        $result = Co\Http\get('https://api.example.com/data');
        $response->end($result->body);
    });
});

$server->start();

گولنگ - همزمانی داخلی

package main

import (
    "fmt"
    "net/http"
    "sync"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        // هر request در goroutine جداگانه
        var wg sync.WaitGroup
        results := make([]string, 3)

        urls := []string{
            "https://api1.example.com",
            "https://api2.example.com",
            "https://api3.example.com",
        }

        // Fetch همه‌ی URL‌ها همزمان
        for i, url := range urls {
            wg.Add(1)
            go func(idx int, u string) {
                defer wg.Done()
                resp, _ := http.Get(u)
                defer resp.Body.Close()
                results[idx] = u
            }(i, url)
        }

        wg.Wait()
        fmt.Fprintf(w, "Done: %v", results)
    })

    http.ListenAndServe(":8080", nil)
}

مقایسه مدل‌ها

ویژگی گولنگ PHP (Traditional) PHP (Swoole)
همزمانی Goroutines Workers Coroutines
Memory per request کم زیاد متوسط
Concurrent requests 100,000+ 50-200 10,000+
یادگیری آسان آسان متوسط
Native support ✅ بله ❌ خیر ❌ خیر

برنده همزمانی: گولنگ - ساده‌تر و قوی‌تر

اکوسیستم

PHP - عظیم و بالغ

فریمورک‌ها:

  • Laravel: محبوب‌ترین، همه‌چیز دارد
  • Symfony: Enterprise-grade
  • Slim: Micro-framework
  • CodeIgniter: ساده و سریع

CMS:

  • WordPress (43% وب)
  • Drupal
  • Joomla
  • Magento (E-commerce)

ابزارها:

  • Composer (Package manager)
  • PHPUnit (Testing)
  • Doctrine (ORM)

گولنگ - تخصصی و مدرن

فریمورک‌ها:

  • Gin: سریع‌ترین
  • Echo: متعادل
  • Fiber: Express-like
  • Chi: Lightweight

ابزارها:

  • go mod (داخلی)
  • go test (داخلی)
  • GORM, sqlx (Database)

مقایسه پکیج‌ها

حوزه PHP (Packagist) گولنگ (pkg.go.dev)
تعداد پکیج 400,000+ 500,000+
Web frameworks عالی خوب
CMS عالی ضعیف
DevOps tools ضعیف عالی

برنده اکوسیستم وب: PHP - Laravel بی‌رقیب است

Deployment

PHP

# روش سنتی
# آپلود فایل‌ها به هر shared hosting

# روش مدرن (Docker)
FROM php:8.3-fpm
COPY . /var/www/html
RUN composer install --no-dev

ویژگی‌ها:

  • Shared hosting ارزان (~$5/month)
  • نیاز به Nginx/Apache + PHP-FPM
  • نصب dependencies با Composer

Go

# Build
go build -o app main.go

# اجرا - همین!
./app

# Docker
FROM scratch
COPY app /app
CMD ["/app"]

ویژگی‌ها:

  • یک فایل باینری
  • نیاز به VPS (~$5/month)
  • Image Size: 10-20MB vs 200MB+

برنده Deployment:

  • PHP برای shared hosting
  • گولنگ برای containers و cloud

بازار کار

آمار جهانی (2024)

معیار Go PHP
استفاده 14% 18%
میانگین حقوق (US) $140,000 $95,000
تعداد شغل کمتر بیشتر
رشد بالا متوسط

بازار کار ایران

PHP:

  • فرصت‌های فراوان
  • آژانس‌های وب، فریلنسری
  • WordPress، Laravel

گولنگ:

  • شرکت‌های فناوری بزرگ
  • حقوق بالاتر
  • رقابت کمتر

موارد استفاده

گولنگ بهترین انتخاب است برای:

API‌های پرترافیک - هزاران request در ثانیه

میکروسرویس‌ها - Docker، Kubernetes

Real-time Applications - WebSocket، Chat

ابزارهای CLI - سرعت و باینری ساده

پروژه‌های جدید - شروع تمیز

PHP بهترین انتخاب است برای:

CMS و Content Sites - WordPress، Drupal

E-commerce - Magento، WooCommerce

CRUD Applications - Laravel عالی است

پروژه‌های موجود - میلیون‌ها سایت PHP

بودجه محدود - shared hosting ارزان

تیم PHP-native - بدون نیاز به آموزش جدید

مقایسه کد: REST API

PHP با Laravel

<?php
// routes/api.php
use App\Models\User;
use Illuminate\Http\Request;

Route::get('/users', function () {
    return User::all();
});

Route::get('/users/{id}', function ($id) {
    return User::findOrFail($id);
});

Route::post('/users', function (Request $request) {
    $validated = $request->validate([
        'name' => 'required|string',
        'email' => 'required|email|unique:users',
    ]);

    return User::create($validated);
});

Go با Gin

package main

import (
    "fmt"
    "net/http"
    "github.com/gin-gonic/gin"
)

type User struct {
    ID    uint   `json:"id"`
    Name  string `json:"name" binding:"required"`
    Email string `json:"email" binding:"required,email"`
}

var users = []User{
    {ID: 1, Name: "علی", Email: "ali@example.com"},
}

func main() {
    r := gin.Default()

    r.GET("/users", func(c *gin.Context) {
        c.JSON(http.StatusOK, users)
    })

    r.GET("/users/:id", func(c *gin.Context) {
        id := c.Param("id")
        for _, u := range users {
            if fmt.Sprint(u.ID) == id {
                c.JSON(http.StatusOK, u)
                return
            }
        }
        c.JSON(http.StatusNotFound, gin.H{"error": "Not found"})
    })

    r.POST("/users", func(c *gin.Context) {
        var user User
        if err := c.ShouldBindJSON(&user); err != nil {
            c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
            return
        }
        user.ID = uint(len(users) + 1)
        users = append(users, user)
        c.JSON(http.StatusCreated, user)
    })

    r.Run(":8080")
}

مقایسه:

  • Laravel: کد کمتر، validation آسان‌تر، ORM قوی
  • Go: سریع‌تر، کنترل بیشتر، type safety

مهاجرت از PHP به گولنگ

چه زمانی مهاجرت کنید؟

بله، به گولنگ مهاجرت کنید اگر:

  • API پرترافیک دارید
  • به real-time نیاز دارید
  • پروژه جدید شروع می‌کنید
  • مشکل مقیاس‌پذیری دارید

نه، نمانید اگر:

  • CMS یا WordPress دارید
  • Laravel خوب کار می‌کند
  • تیم فقط PHP بلد است
  • بودجه محدود است

استراتژی مهاجرت

  1. تدریجی: سرویس‌های جدید با گولنگ
  2. موازی: API جدید با گولنگ، قدیمی با PHP
  3. کامل: فقط برای پروژه‌های کوچک

جدول تصمیم‌گیری

گولنگ را انتخاب کنید اگر:

شرط  
به عملکرد بالا نیاز دارید
میکروسرویس می‌سازید
پروژه جدید شروع می‌کنید
Real-time نیاز دارید
روی Cloud/Kubernetes هستید

PHP را انتخاب کنید اگر:

شرط  
CMS/WordPress می‌خواهید
CRUD ساده می‌سازید
بودجه محدود دارید
تیم PHP دارید
Laravel می‌خواهید
پروژه موجود دارید

نتیجه‌گیری

جنبه برنده
سرعت اجرا گولنگ
همزمانی گولنگ
اکوسیستم وب PHP
CMS/Content PHP
یادگیری مساوی
هزینه hosting PHP
Cloud-native گولنگ

خلاصه:

  • PHP هنوز برای وب‌سایت‌های سنتی، CMS و CRUD عالی است
  • گولنگ برای API‌های مدرن، میکروسرویس‌ها و سیستم‌های پرترافیک بهتر است

اگر Laravel خوب کار می‌کند، دلیلی برای مهاجرت نیست. اما برای پروژه‌های جدید با نیازهای عملکردی بالا، گولنگ انتخاب بهتری است.


شروع یادگیری Go

مقایسه‌های مرتبط

منابع

بیش از ۱۰۰۰ شرکت‌کننده یادگیری Go و Backend رو از امروز شروع کن
ثبت‌نام دوره + تیم‌سازی